您的位置:首页 > 其它

poj 2488 dfs(骑士环游世界)

2012-01-18 01:16 393 查看
这是我在新浪写的第一篇博文了吧,嘿嘿,把它也贴过来。一个经典的dfs。

#include<iostream>
using namespace std;
#define max 26
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
//定义八个方向 因为要按字典树输出
//棋盘应该是按照下面形式分布的(因为这样符合数组的情况)
//所以yy[max]是存的字母  那就是“尽量优先往左上跳” (纵坐标尽量小的情况小横坐标尽量小)
//则方向数组这样写
int map[max][max],xx[max],yy[max],p,q,step,flag;
//路径,X坐标,Y坐标,长,宽,步数,成功标志
void dfs(int i,int j)
{
//printf("%d %d\n",i,j);
int x,y;
if(flag) return;
xx[step]=i;
yy[step]=j;
step++;//走的步数
map[i][j]=1;
if((step-1)==p*q)//如果遍历的棋盘,则返回 并且成功标记=1
{flag=1;return;}
for(int k=0;k<8;k++)
{
x=i+dir[k][0];
y=j+dir[k][1];
//printf("%d %d");
//system("pause");
//如果不越界 则按条件继续搜索
if(!map[x][y]&&x>=1&&x<=p&&y>=1&&y<=q)
{
dfs(x,y);
step--;
}
}
map[i][j]=0;
}

int main()
{
int t,h=0;
cin>>t;
while(t--)
{
cin>>p>>q;
h++;
flag=0;
step=1;
memset(map,0,sizeof(map));
dfs(1,1);
if(flag)
{
printf("Scenario #%d:\n",h);
for(int i=1;i<=p*q;i++)
{
printf("%c%d",yy[i]+64,xx[i]);
//输出每一步跳过的位置

}
cout<<endl<<endl;
}
else
{
printf("Scenario #%d:\n",h);
printf("impossible\n\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: