经典的骑士巡游问题,注意字典序最小,应该从上到下,从左到右遍历
#include <iostream> #include <cstdio> #include <vector> using namespace std; const int maxn=30; int di[]={-1,1,-2,2,-2,2,-1,1},dj[]={-2,-2,-1,-1,1,1,2,2},n,m; bool vis[maxn][maxn]; vector<char>stak; bool backtraking(int ci,int cj,int cnt){ vis[ci][cj]=1; if(cnt==0){ for (int i=0;i<stak.size();++i) { printf("%c",stak[i]); } printf("\n"); return true; } for (int i=0;i<8;++i) { int ni=ci+di[i],nj=cj+dj[i]; if(ni>=0&&ni<n&&nj>=0&&nj<m&&!vis[ni][nj]){ stak.push_back('A'+nj),stak.push_back('1'+ni); if(backtraking(ni,nj,cnt-1))return true; stak.pop_back(),stak.pop_back(); } } vis[ci][cj]=0; return false; } int main(){ int t,cas=1; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); int i,j; for (int i=0;i<30;++i) for (int j=0;j<30;++j)vis[i][j]=0; printf("Scenario #%d:\n",cas++); stak.clear(); for (i=0;i<m;++i) { for (j=0;j<n;++j) { stak.push_back('A'+i),stak.push_back('1'+j); if(backtraking(j,i,n*m-1))break; stak.pop_back(),stak.pop_back(); } if(j<n)break; } if(i>=m)printf("impossible\n"); printf("\n"); } return 0; }