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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号