POJ——2488(深度搜索)
2012-08-04 09:53
253 查看
题目链接:http://poj.org/problem?id=2488
转载处:優YoU http://user.qzone.qq.com/289065406/blog/1303350143
源代码:
#include<iostream>
using namespace std;
class location
{
public:
int row;
char col;
};
int p,q; //chess size = p*q
//数字是行p,字母是列q
bool chess['Z'+1][27];
int x,y; //返回值
void path(int i,int j,int num) //ij为骑士当前在棋盘的位置
{ //num为骑士即将要跳到的位置序号
switch(num)
{
case 1: {x=i-1; y=j-2; break;} //注意这个尝试跳的顺序不能错
case 2: {x=i+1; y=j-2; break;} //因为题目要求是字典序lexicographically输出
case 3: {x=i-2; y=j-1; break;} //这个顺序错了,必定WA
case 4: {x=i+2; y=j-1; break;}
case 5: {x=i-2; y=j+1; break;}
case 6: {x=i+2; y=j+1; break;}
case 7: {x=i-1; y=j+2; break;}
case 8: {x=i+1; y=j+2; break;}
}
return;
}
bool DFS(location* way,int i,int j,int step)
{
chess[i][j]=true;
way[step].row=i;
way[step].col=j;
if(step==way[0].row)
return true;
for(int k=1;k<=8;k++) //骑士从当前位置尝试跳到其他位置
{
path(i,j,k);
int ii=x,jj=y;
if(!chess[ii][jj] && ii>=1 && ii<=p && jj>='A' && jj<='A'+q-1)
if(DFS(way,ii,jj,step+1))
return true;
}
chess[i][j]=false; //能执行到这步,说明前面跳的8步都不符合要求
return false; //即当前位置是错误位置,擦除记录返回上一步
}
int main(void)
{
int test;
cin>>test;
int t=1;
while(t<=test)
{
/*Initial*/
memset(chess,false,sizeof(chess));
cin>>p>>q;
if(p==1 && q==1) //范围缩窄,不要也能AC
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"A1"<<endl<<endl;
continue;
}
if(p*q>26 || p>=9 || q>=9 || p<=2 || q<=2) //范围缩窄,不要也能AC
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"impossible"<<endl<<endl;
continue;
}
location* way=new location[p*q+1]; //记录走过的位置坐标
way[0].row=p*q; //记录总步数(棋盘总格子数)
/*DFS*/
bool flag=false;
for(int j='A';j<='A'+q-1;j++)
{
for(int i=1;i<=p;i++)
if(DFS(way,i,j,1))
{
cout<<"Scenario #"<<t++<<':'<<endl;
for(int k=1;k<=way[0].row;k++)
cout<<way[k].col<<way[k].row;
cout<<endl<<endl;
flag=true;
break;
}
if(flag)
break;
}
if(!flag)
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"impossible"<<endl<<endl;
}
}
return 0;
}
转载处:優YoU http://user.qzone.qq.com/289065406/blog/1303350143
源代码:
#include<iostream>
using namespace std;
class location
{
public:
int row;
char col;
};
int p,q; //chess size = p*q
//数字是行p,字母是列q
bool chess['Z'+1][27];
int x,y; //返回值
void path(int i,int j,int num) //ij为骑士当前在棋盘的位置
{ //num为骑士即将要跳到的位置序号
switch(num)
{
case 1: {x=i-1; y=j-2; break;} //注意这个尝试跳的顺序不能错
case 2: {x=i+1; y=j-2; break;} //因为题目要求是字典序lexicographically输出
case 3: {x=i-2; y=j-1; break;} //这个顺序错了,必定WA
case 4: {x=i+2; y=j-1; break;}
case 5: {x=i-2; y=j+1; break;}
case 6: {x=i+2; y=j+1; break;}
case 7: {x=i-1; y=j+2; break;}
case 8: {x=i+1; y=j+2; break;}
}
return;
}
bool DFS(location* way,int i,int j,int step)
{
chess[i][j]=true;
way[step].row=i;
way[step].col=j;
if(step==way[0].row)
return true;
for(int k=1;k<=8;k++) //骑士从当前位置尝试跳到其他位置
{
path(i,j,k);
int ii=x,jj=y;
if(!chess[ii][jj] && ii>=1 && ii<=p && jj>='A' && jj<='A'+q-1)
if(DFS(way,ii,jj,step+1))
return true;
}
chess[i][j]=false; //能执行到这步,说明前面跳的8步都不符合要求
return false; //即当前位置是错误位置,擦除记录返回上一步
}
int main(void)
{
int test;
cin>>test;
int t=1;
while(t<=test)
{
/*Initial*/
memset(chess,false,sizeof(chess));
cin>>p>>q;
if(p==1 && q==1) //范围缩窄,不要也能AC
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"A1"<<endl<<endl;
continue;
}
if(p*q>26 || p>=9 || q>=9 || p<=2 || q<=2) //范围缩窄,不要也能AC
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"impossible"<<endl<<endl;
continue;
}
location* way=new location[p*q+1]; //记录走过的位置坐标
way[0].row=p*q; //记录总步数(棋盘总格子数)
/*DFS*/
bool flag=false;
for(int j='A';j<='A'+q-1;j++)
{
for(int i=1;i<=p;i++)
if(DFS(way,i,j,1))
{
cout<<"Scenario #"<<t++<<':'<<endl;
for(int k=1;k<=way[0].row;k++)
cout<<way[k].col<<way[k].row;
cout<<endl<<endl;
flag=true;
break;
}
if(flag)
break;
}
if(!flag)
{
cout<<"Scenario #"<<t++<<':'<<endl;
cout<<"impossible"<<endl<<endl;
}
}
return 0;
}
相关文章推荐
- POJ-2488 A Knights Journey-深度优先搜索DFS
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
- POJ-2386-Lake Counting(深度优先搜索初步!)
- poj2676——Sudoku(深度搜索)
- POJ 2488 Children of the Candy Corn (搜索)
- DFS深度搜索算法实现深度探究解析-以POJ 1040为例
- !POJ 2488 dfs--按顺序搜索
- POJ 2488 A Knight's Journey 水搜索
- POJ 1979 - Red and Black 深度优先搜索
- poj2488-搜索
- POJ 2362:Square 觉得这才算深度搜索
- 深度优先搜索dfs(poj 1655)
- POJ 2362:Square 觉得这才算深度搜索
- Poj 2488 A Knight's Journey(搜索)
- poj2488 A Knight's Journey 简单DFS 注意搜索步骤
- poj入门水题--深度搜索(dfs)题 1011,含各种剪枝,比较经典
- poj1088 滑雪 dp记忆化搜索 dfs深度优先搜索
- Hopscotch(poj 3050)深度优先搜索
- 深度搜索DFS-Lake Counting(POJ NO.2386)
- Poj 2488 A Knight's Journey(搜索)