您的位置:首页 > 其它

poj2488骑士之旅

2013-07-11 21:24 330 查看
题目大意:国际象棋里面的马,有那么8种跳法,然后题目给出一个棋盘的大小p*q, 求有没有路线可以使得这个马能把整个棋盘的格全部走一遍,有的话按照字典序将第一条路线打印出来。

注意:国际象棋是行是数字,列是字母,按照字典序A1B3....,是需要按照先列后行来处理的。

因为要找一条路径出来,所以考虑深度优先(DFS)

贴一下烂代码(o(╯□╰)o):

#include<iostream>
#include<string>
using namespace std;

int chess[27][27];
int path;
bool exist=0;
string rec;

void DFS(int y,int x,int szy,int szx)
{
chess[x][y]=1;
path++;
rec.push_back(char(y+'A'));
rec.push_back(char(x+'1'));
//cout<<"Beginning:"<<rec<<endl;
int increx,increy;//,flag=0;
for(int n=0;n<8;n++)
{
switch(n){
case 0:
increy=-2;increx=-1;break;
case 1:
increy=-2;increx=1;break;
case 2:
increy=-1;increx=-2;break;
case 3:
increy=-1;increx=+2;break;
case 4:
increy=+1;increx=-2;break;
case 5:
increy=+1;increx=+2;break;
case 6:
increy=+2;increx=-1;break;
case 7:
increy=+2;increx=+1;break;
}
if(y+increy>=szy||y+increy<0||x+increx>=szx||x+increx<0) continue;
else if(chess[x+increx][y+increy]==0)
{
DFS(y+increy,x+increx,szy,szx);
}
}

if(path==szy*szx)
{
//cout<<"result:"<<rec<<endl;
exist=1;
}
else{
path--;
rec.erase(rec.end()-1);
rec.erase(rec.end()-1);
//cout<<"Delete:"<<rec<<endl;
chess[x][y]=0;
}

}

int main()
{
int instan,p,q,i,j,k;
cin>>instan;
for(i=0;i<instan;i++)
{
exist=0;

memset(chess,0,sizeof(chess));
cin>>p>>q;
cout<<"Scenario #"<<i+1<<":"<<endl;
for(j=0;j<q;j++)
{
for(k=0;k<p;k++)
{
path=0;
rec.clear();
//cout<<"Start from "<<k<<" "<<j<<":"<<endl;
DFS(j,k,q,p);
if(exist==1)
{
cout<<rec<<endl;
break;
}

}
if(exist==1)
{
break;
}
}
if(exist==0) cout<<"impossible"<<endl;
cout<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: