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;
}

  

原文地址:https://www.cnblogs.com/lautsie/p/3176990.html