您的位置:首页 > 其它

A Knight's Journey--POJ 2488

2010-07-23 20:52 316 查看
1、解题思路:经典深度搜索。

2、注意事项:骑士跳转的顺序(注意字母编撰顺序),DFS中递归注意控制入口的数目。

3、实现方法:

#include<iostream>
using namespace std;

int dir[8][2]={
{-1,-2},{1,-2},{-2,-1},{2,-1},
{-2,1},{2,1},{-1,2},{1,2}
};
struct Node
{
int x,y;
bool Exite;
};
Node loc[27];
int x,y,step,map[27][27];
bool mark;

bool Judge(int pos_x,int pos_y)
{
if(pos_x>x||pos_x<1||pos_y>y||pos_y<1)
return false;
if(map[pos_x][pos_y])
return false;
return true;
}

void DFS(int pos_x,int pos_y)
{
if(!mark)
{
for(int i=0;i<8;i++)
{
if(Judge(pos_x+dir[i][0],pos_y+dir[i][1]))
{
if(step==x*y-1)
{
mark=1;
step++;
map[pos_x+dir[i][0]][pos_y+dir[i][1]]=1;
loc[step].x=pos_x+dir[i][0];
loc[step].y=pos_y+dir[i][1];
break;
}
if(mark==1)
return ;
step++;
map[pos_x+dir[i][0]][pos_y+dir[i][1]]=1;
loc[step].x=pos_x+dir[i][0];
loc[step].y=pos_y+dir[i][1];
DFS(pos_x+dir[i][0],pos_y+dir[i][1]);
step--;
map[pos_x+dir[i][0]][pos_y+dir[i][1]]=0;
}
}
}
}

int main()
{
int n,i=0,flag;
cin>>n;
while(n--)
{
cin>>x>>y;
step=0;
memset(map,0,sizeof(map));
memset(loc,0,sizeof(loc));
cout<<"Scenario #"<<++i<<":"<<endl;
flag=0;
for(int p=1;p<=x;p++)
{
for(int q=1;q<=y;q++ )
{
if(!flag)
{
step=1;
mark=0;
memset(map,0,sizeof(map));
memset(loc,0,sizeof(loc));
map[p][q]=1;
loc[step].x=p;
loc[step].y=q;
DFS(p,q);
if(x*y==1)
mark=1;
if(mark)
{
for(int j=1;j<=x*y;j++)
{
cout<<char(loc[j].y+'A'-1)<<char(loc[j].x+'0');
}
if(n==0)
cout<<endl;
else
cout<<endl<<endl;
flag=1;
}
}

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