1.题目地址:
http://121.249.217.157:8080/contest/view.action?cid=54#problem/E
http://poj.org/problem?id=2488
2.可参考地址:http://blog.csdn.net/lyy289065406/article/details/6647666
3.自己的思路:
(1)字典序输出,所以在设置方向数组的时候,要设置好,(我设置的方向数组保证先找到的一定为字典序)
(2)设置flag[ ][ ]保证不回到前一结点,但当它后续路径都不能到达的时候,要重新设置为0。
4.源代码:
#include<iostream>
#include<string.h>
using namespace std;
int dr1[8]={-2,-2,-1,-1,1,1,2,2};
int dr2[8]={-1,1,-2,2,-2,2,-1,1};
int p,q;
int neng;
int flag[30][30];
struct N
{
char c;
int y;
}a[9000];//存储的是路径
void dfs(int x,int y,int count)
{
int dx,dy;
for(int i=0;i<8;i++)
{
dx=x+dr1[i];
dy=y+dr2[i];
if(dx>=0&&dx<p&&dy>=0&&dy<q&&!neng&&!flag[dx][dy])
{
a[count].c=dx+'A';
a[count].y=dy+1;
flag[dx][dy]=1;
if(count==p*q-1)
{
neng=1;
for(int k=0;k<=count;k++)
cout<<a[k].c<<a[k].y;
cout<<endl;
break;
}
dfs(dx,dy,count+1);
flag[dx][dy]=0;
}
}
}
int main()
{
int case1;
cin>>case1;
int mid=case1;
while(case1--)
{
cin>>q>>p;
if(mid-1!=case1) cout<<endl;
neng=0;
cout<<"Scenario #"<<mid-case1<<":"<<endl;
if(q==1&&p==1)
{
cout<<"A1"<<endl;
continue;
}
memset(flag,0,sizeof(flag));
flag[0][0]=1;//初始设置
a[0].c='A';
a[0].y=1;
dfs(0,0,1);
if(!neng) cout<<"impossible"<<endl;
}
}