題目鏈接:點擊打開鏈接
dfs水題,給出棋盤尺寸,求出馬走遍棋盤的路徑,或者輸出impossible,路徑要按字典序輸出。
首先國際象棋的馬走L路線,橫向爲字母A—Z,縱向爲1—26,要做到字典序最小,第一步首先要最小,要從A1開始,搜索時也要按字典序最小搜索,從左到右,
從上到下,若馬的座標爲C3,則搜索順序爲:A2,A4,B1,B5,D1,D5,E2,E4。
//172K 16MS
//C++ 1016B
#include <cstdio>
#include <cstring>
int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int vis[27][27];
struct step
{
int x,y;
}s[26*26];
int n,m,step,flag;
void dfs(int x,int y,int dp)
{
if(n*m==dp)
{
flag=1;
return;
}
for(int i=0;i<8;i++)
{
int sx=x+d[i][0];
int sy=y+d[i][1];
if(sx>=0&&sx<n&&sy>=0&&sy<m&&!vis[sx][sy])
{
s[dp].x=sx;
s[dp].y=sy;
vis[sx][sy]=1;
dfs(sx,sy,dp+1);
vis[sx][sy]=0;
if(flag) return;
}
}
}
int main()
{
int k,t,i,l=0;
scanf("%d",&t);
for(k=1;k<=t;k++)
{
flag=0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
printf("Scenario #%d:\n",++l);
vis[0][0]=1;
dfs(0,0,1);
if(flag)
for(i=0;i<n*m;i++)
printf("%c%d",s[i].y+'A',s[i].x+1);
else
printf("impossible");
printf("\n\n");
}
return 0;
}