poj1248深度搜索简单题
2014-09-09 20:56
260 查看
//题意:总26个字母中给出5到12个大写字母,从中选出5个字母组成vwxyz
//满足条件:v-w^2+x^3-y^4+z^5 = target找出其中最大字典序的vwxyz对应的字母
//思路:很明显是一个搜索问题 考虑深搜找出满足条件的5个字母
//204K 16MS
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAX_N 13
int target;
string ans;
int success;
int path[MAX_N];
int visit[MAX_N];
int power(int a,int n) //计算a^n
{
int i,ans=1;
for(i=1;i<=n;i++)
ans*=a;
return ans;
}
void dfs(string&str,int step,int sum){
if (success)
return;
if (step==6)
{
if (sum == target)
{
for (int i=0;i<5;++i)
ans[i] = visit[i]+'A';
success = 1;
return;
}
else
return;
}
for (int i=str.size()-1;i>=0;--i)
{
if (path[i]==1)
continue;
int num = str[i] - 'A' + 1;
path[i] = 1;
visit[step-1] = num-1;
if (step%2==0)
sum -= power(num,step);
else
sum += power(num,step);
dfs(str,step+1,sum);
if (step%2==0)
sum +=power(num,step);
else
sum -= power(num,step);
path[i] = 0;
}
}
int main(){
while(cin>>target){
string str;
cin>>str;
ans.clear();
ans.resize(5);
success = 0;
memset(path,0,sizeof(path));
memset(visit,0,sizeof(visit));
if (target==0&&str=="END")
break;
sort(str.begin(),str.end());
dfs(str,1,0);
if (!success)
cout<<"no solution"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
代码有点麻烦主要好久没做搜索题了...
//满足条件:v-w^2+x^3-y^4+z^5 = target找出其中最大字典序的vwxyz对应的字母
//思路:很明显是一个搜索问题 考虑深搜找出满足条件的5个字母
//204K 16MS
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAX_N 13
int target;
string ans;
int success;
int path[MAX_N];
int visit[MAX_N];
int power(int a,int n) //计算a^n
{
int i,ans=1;
for(i=1;i<=n;i++)
ans*=a;
return ans;
}
void dfs(string&str,int step,int sum){
if (success)
return;
if (step==6)
{
if (sum == target)
{
for (int i=0;i<5;++i)
ans[i] = visit[i]+'A';
success = 1;
return;
}
else
return;
}
for (int i=str.size()-1;i>=0;--i)
{
if (path[i]==1)
continue;
int num = str[i] - 'A' + 1;
path[i] = 1;
visit[step-1] = num-1;
if (step%2==0)
sum -= power(num,step);
else
sum += power(num,step);
dfs(str,step+1,sum);
if (step%2==0)
sum +=power(num,step);
else
sum -= power(num,step);
path[i] = 0;
}
}
int main(){
while(cin>>target){
string str;
cin>>str;
ans.clear();
ans.resize(5);
success = 0;
memset(path,0,sizeof(path));
memset(visit,0,sizeof(visit));
if (target==0&&str=="END")
break;
sort(str.begin(),str.end());
dfs(str,1,0);
if (!success)
cout<<"no solution"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
代码有点麻烦主要好久没做搜索题了...
相关文章推荐
- POJ 3414-Pots 简单搜索 BFS
- POJ 1321-棋盘问题 简单搜索DFS
- ACM-POJ 1562 DFS 深度优先搜索
- poj 1033 Defragment 简单搜索
- POJ 2531 Network Saboteur(简单搜索技巧 + 剪枝)
- poj 1775 简单搜索
- poj 2488 简单的搜索
- poj1088 DFS深度搜索
- POJ——2488(深度搜索)
- DFS (深度搜索) 简单应用 ---- 分解因子
- POJ 2386 Lake Counting 简单的DFS搜索
- DFS深度搜索算法实现深度探究解析-以POJ 1040为例
- DFS深度搜索算法实现深度探究解析-以POJ 1040为例
- poj 3909 简单 搜索
- POJ 简单搜索
- POJ 1011-Sticks 简单搜索DFS
- 简单搜索1979@POJ
- poj 1562 简单的BFS搜索
- poj 3009(深度搜索)
- poj 1167 简单搜索