POJ1248 Safecracker

第一次写DFS的程序,虽然是个水题。
1. 学了memset
2. 可以存下来A-Z的各个次方的结果
3. 可以排序优化
4. 我用了t[0]==0来判断是否有解,也可设个flag
5. 用了递归,也可用五层循环

#include <iostream>

#include <cstring>



using namespace std;



int n;

int len;

char s[15];

int vis[15];

int t[5];

int p[5];



void check()

{

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

	{

		if (p[i] > t[i])

		{

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

			{

				t[j] = p[j];

			}

			break;

		}

		if (p[i] < t[i])

		{

			break;

		}

	}

}



void dfs(int cur)

{

	if (cur == 5)

	{

		if (n == p[0] - p[1] * p[1] + p[2] * p[2] * p[2] - p[3] * p[3] * p[3] * p[3] + p[4] * p[4] * p[4] * p[4] * p[4] )

		{

			check();

		}

	}

	else

	{

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

		{

			if (!vis[i])

			{

				vis[i] = 1;

				p[cur] = s[i] - 'A' + 1;

				dfs(cur + 1);

				vis[i] = 0;

			}

		}

	}

}



int main()

{	

	while (true)

	{

		cin >> n >> s;

		if (n == 0)

		{

			return 0;

		}

		len = strlen(s);

		memset(vis, 0, sizeof(vis));

		memset(t, 0, sizeof(t));

		memset(p, 0, sizeof(p));

		dfs(0);

		if (t[0] == 0)

		{

			cout << "no solution" << endl;

		}

		else

		{

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

			{

				cout << (char) (t[i] + 'A' - 1);

			}

			cout << endl;

		}

	}

	return 0;

}

  

你可能感兴趣的:(rack)