传送门
题意:问能否从某点出发,走日字遍历所有点,每个点只经过1次。能则输出字典序最小的路径。
思路:昨天看到群里有人探讨这题,今天就顺手做了。这里就是基本的DFS,关于字典序,只要注意搜索下一个点的顺序就能保证。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int m,n; bool v[50][50]; int num; int ok; int xx[8]={-1,1,-2,2,-2,2,-1,1}; int yy[8]={-2,-2,-1,-1,1,1,2,2}; int ax[50],ay[50]; void dfs(int x,int y,int s) { v[x][y]=1; ax[s]=x; ay[s]=y; if(s==m*n) { ok=1; printf("Scenario #%d:\n",num++); for(int i=1;i<=m*n;i++) { printf("%c%d",ay[i]+64,ax[i]); } printf("\n"); return; } for(int i=0;i<8;i++) { if(ok)return; if(x+xx[i]>0&&x+xx[i]<=m&&y+yy[i]>0&&y+yy[i]<=n&&v[x+xx[i]][y+yy[i]]==0) { dfs(x+xx[i],y+yy[i],s+1); } } v[x][y]=0; } int main() { int t; num=1; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); memset(v,0,sizeof(v)); ok=0; for(int j=1;j<=n;j++) { if(ok)break; for(int i=1;i<=m;i++) { dfs(i,j,1); if(ok)break; } } if(!ok)printf("Scenario #%d:\nimpossible\n",num++); printf("\n"); } return 0; }