STL——字典排序问题next_permutation(a.begin(),a.end())

在做每周一赛的时候,有一道我觉得题目想起来不算特别难,但是实现起来相当烦琐。而且还AC不了,我先po上我自己写的代码(啰嗦死了),勿喷。

原题链接:http://soj.me/7530

#include <iostream>

#include <string>

using namespace std;



int main()

{

	string SS[6];

	char crosswords[3][3];

	string answer;

	string result;

	int i,j,k,l,t,m;

	int symbol;

	bool judge = false;

	for(i = 0;i < 6;i++)

	{

		cin >> SS[i];

	}

	for(i = 0;i < 6;i++)

	{

		for(j = 0;j < 3;j++)

		{

			char temp = SS[i][j];

			bool tt = false;

			for(k = 0;k < 6;k++)

			{

				if(temp == SS[k][0])

				{

					tt = true;

					break;

				}

			}

			if(tt == true)

				continue;

			else

				break;

		}

		if(j >= 3)

		{

			answer = SS[i];   //表明已经找到了字典序排序最低的符合第一个要求的答案

			symbol = i;

			for(l = 0;l < 3;l++)

				crosswords[0][l] = answer[l];  //填入九宫格第一行

			for(l = 0;l < 3;l++)

			{

				string aa;

				for(t = 0;t < 6;t++)

				{

					if(answer[l] == SS[t][0] && t !=  symbol)

					{

						aa = SS[t];

						for(m = 0;m < 3;m++)

						{

							crosswords[m][l] = aa[m];

						}

					}

				}

			}

			//开始检测九宫格的正确性

			bool cc = false;

			for(l = 0;l < 6;l++)

			{

				if(crosswords[1][0] == SS[l][0])

				{ 

					for(m = 0;m < 3;m++)

					{

						if(crosswords[1][m] != SS[l][m])

							break;

					}

				}

				if(m >= 3)

				{

					cc = true;

					break;

				}

			}

			if(cc == false)

				break;

			for(l = 0;l < 3;l++)



			cc = false;

			for(l = 0;l < 6;l++)

			{

				if(crosswords[2][0] == SS[l][0])

				{ 

					for(m = 0;m < 3;m++)

					{

						if(crosswords[2][m] != SS[l][m])

							break;

					}

				}

				if(m >= 3)

				{

					cc = true;

					break;

				}

			}

			if(cc == true)

			{

				judge = true;

				break;

			}

		}

	}

	if(judge == true)

	{

		for(i = 0;i < 3;i++)

		{

			for(j = 0;j < 3;j++)

				cout << crosswords[i][j];

			cout << endl;

		}

	}

	else

		cout << 0 << endl;

	return 0;

}

 结果在苦苦挣扎之后,我决定求助大神,发现这道题的解法真是碉堡了。大神提供的代码不仅简介漂亮,而且通俗易懂。

现在想起来,我想复杂了,其实这道题目就用两个字便可以击破:暴力。

其实真不用什么高效的算法,直接暴力解法就好,题目要求写出最少字典序的方案,所以之前还没有用过STL里面的字典排序next_permutation()函数。

这里便发挥了作用。

代码实现:

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;



int main() {



	vector<string> a;

	a.resize(6);

	bool ok = false;



	for (int i = 0; i < 6; ++i)

		cin >> a[i];

	

	do {

		string stupci[3];

		

		for (int i = 0; i < 3; ++i)

			for (int j = 0; j < 3; ++j)

				stupci[j] += a[i][j];

				

		ok = true;

		for (int i = 0; i < 3; i++)

			if (stupci[i] != a[i + 3])

				ok = false;



		if (ok) {

			for (int i = 0; i < 3; ++i)

				cout << a[i] << endl;

			break;

		}

			

	} while (next_permutation(a.begin(), a.end()));

	

	if (!ok)

		cout << 0 << endl;

}

 

你可能感兴趣的:(ext)