#include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; int map[8][8];//直接将坐标值换成递增数字编号 bool visited[8][8]; int road[64];//路径 const int oo=100; struct node{int dx;int dy;int outdegree;int x;int y;}; //为了保存方向和出度而设置的节点 vector<node> odeg; //便于统计个数而用了vector bool cmp(node a,node b){ return (a.outdegree<b.outdegree); } void initial() { int ini=1; for(int i=0;i<8;i++) for(int j=0;j<8;j++) map[i][j]=ini++; } void set() { for(int i=0;i<8;i++) for(int j=0;j<8;j++) visited[i][j]=0; } void print() { for(int i=0;i<63;i++) printf("%d ",road[i]); printf("%d/n",road[63]); } bool dfs(node cur,int count) { if(count==64) return true; //计算当前节点周围可达节点的度数 for(int i=0;i<8;i++){ node tnode; tnode.outdegree=oo; tnode.dx=dir[i][0]; tnode.dy=dir[i][1]; tnode.x=cur.x+dir[i][0]; tnode.y=cur.y+dir[i][1]; if(tnode.x<8&&tnode.x>-1&&tnode.y<8&&tnode.y>-1&&!visited[tnode.x][tnode.y]){ tnode.outdegree=0; int tx,ty; for(int j=0;j<8;j++){ tx=tnode.x+dir[j][0]; ty=tnode.y+dir[j][1]; if(tx<8&&tx>-1&&ty<8&&ty>-1&&!visited[tx][ty]) tnode.outdegree++;} } if(tnode.outdegree!=oo) odeg.push_back(tnode); } sort(odeg.begin(),odeg.end(),cmp); //选最小出度 if(odeg.empty()) return false; int nx,ny; //以下方法同1152典型的只输出一条路径的bool形做法 nx=cur.x+odeg[0].dx;//输出所有路径用void,将路径一一打印 ny=cur.y+odeg[0].dy; visited[nx][ny]=1; road[count]=map[nx][ny]; node tmp=odeg[0]; odeg.clear(); //一定要清空全局变量 if(dfs(tmp,count+1)) return true; else visited[nx][ny]=0; return false; } int main() { int s; initial(); while(scanf("%d",&s),s!=-1){ int count=1; set(); road[0]=s; int x,y; x=s/8; y=s%8; if(y==0) {x--;y=8;} y--; visited[x][y]=1; node cur; cur.x=x; cur.y=y; dfs(cur,1); print(); } return 0; }