题意:一个骑士,按照“日”字走法, 问骑士能否在 p*q 的棋盘上,从某个点出发不重复走遍棋盘每个点,如果能,输出骑士每步的位置(按字典序),如果不能,则输出impossible。
题解:设A1为首位置(证明如果能走完的话,必存在一条起点为A1的路径);遍历时先选字典序最小的。
#define INF 0x7fffffff #define eps (1e-9) #define clearto(s,x) memset(s,x,sizeof(s)) #define prime 999983 #define maxn 100010 using namespace std; typedef long long llong; int n,m,t,tot=0; int ok,stp; bool vis[30][30]; int sm[30],sn[30]; int dx[8]={ -2,-2,-1,-1, 1, 1, 2, 2 }; int dy[8]={ -1, 1,-2, 2,-2, 2,-1, 1 }; void dfs(int x,int y){ if(ok) return; stp++; sm[stp]=x; sn[stp]=y; vis[x][y]=1; if(stp==tot) { ok =1; return; } for(int i=0;i<8;i++){ int nx =x+dx[i]; int ny =y+dy[i]; if( !vis[nx][ny]&&nx>0&&ny>0&&nx<=m&&ny<=n ) { dfs(nx,ny); stp--; } } vis[x][y] =0; } int main() { //freopen("D:\data.txt","r",stdin); int TT,tt=1,i,j,k; scanf("%d",&TT); while(tt<=TT){ clearto(vis,0); scanf("%d %d",&n,&m); //数字(1-n), 字母(1-m) ok =0; stp =0; tot =n*m; dfs(1,1); printf("Scenario #%d:\n",tt); if(ok){ for(i=1;i<=tot;i++) printf("%c%d",sm[i]+64,sn[i]); putchar(10); } else printf("impossible\n"); if(tt!=TT) printf("\n"); tt++; } return 0; }