HDOJ1015
题目
思路
这道题可以抽象为排列问题。
假设有12个字母,要选出5个字母分别代入v-w^2+ x^3 -y^4+ z^5式子里。数学上,这就是一个排列问题,一共有95040种结果。程序上,排列问题可以用dfs解决。
代码
//数组a表示字母对应的int数值
//a[step] = 1表示第step(step范围:1-5)个位置放置的字母是‘A’
//book[i] = 0表示字符串str里下标为i的字符未在式子中使用
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<cstdio>
using namespace std;
int target;
char str[20];
int a[20], book[20];
bool sortspecial(int x, int y)
{
return x>y;
}
bool dfs(int step)
{
if(step==6)
{
int sum = 0;
int temp = 1;
for(int i=1;i<6;i++)
{
sum+=temp*pow(a[i], i);
temp*=-1;
}
if((int)sum==target)
{
for(int i=1;i<6;i++)
{
printf("%c", a[i]+'A'-1);
}
cout<<endl;
return true;
}
return false;
}
for(int i=0;i<strlen(str);i++)
{
if(book[i]==0)
{
a[step] = str[i]-'A'+1;
book[i] = 1;
if(dfs(step+1))
{
return true;
}
book[i] = 0;
}
}
return false;
}
int main()
{
while(cin>>target&&target!=0)
{
memset(book, 0, sizeof(book));
cin>>str;
sort(str, str+strlen(str), sortspecial);
if(dfs(1)==false)
{
cout<<"no solution"<<endl;
}
}
return 0;
}
Conclusion
掌握了除迷宫问题以外的dfs的使用,也就是排列组合问题。