一道DFS的简单题,却做了好久。。。
一开始开了两个队列去维护每一步的坐标,结果疯狂错,还一直找不到bug,无奈看了别人的代码,改用了数组才过。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
queue<int> p,q;
char s[31][31];
int h[30],l[30];
int flag,p0,q0,dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
void travel(int x,int y,int mov)
{
h[mov]=x;
l[mov]=y;
if(mov==p0*q0)
{
flag=1;
return;
}
for(int i=0;i<=7;i++)
{
int x0=x+dir[i][0],y0=y+dir[i][1];
if(x0>=1&&x0<=p0&&y0>=1&&y0<=q0)
{
if(s[x0][y0]=='0')
{
s[x0][y0]='1';
// p.push(x0);q.push(y0);
travel(x0,y0,mov+1);
s[x0][y0]='0';
// p.pop();q.pop();
}
}
if(flag) return;
}
}
int main()
{
int n,kase=0;
cin>>n;
while(n--)
{
cin>>p0>>q0;
flag=0;
printf("Scenario #%d:\n",++kase);
if(p0==1&&q0==1)
printf("A1\n");
else if(q0<3||p0<3)
printf("impossible\n");
else
{
for(int i=0;i<=30;i++)
for(int j=0;j<=30;j++)
s[i][j]='0';
s[1][1]='1';
// p.push(1);q.push(1);
travel(1,1,1);
if(flag)
{
int a,b;
// printf("%d\n",q.size());
/* while(!p.empty()&&!q.empty())
{
b=q.front();
a=p.front();
printf("%c%d",b+64,a);
q.pop();
p.pop();
}printf("\n");*/
for(int i=1;i<=p0*q0;i++)
printf("%c%d",l[i]+64,h[i]);
printf("\n");
}
else printf("impossible\n");
}
if(n) printf("\n");
}
return 0;
}