A Knight's Journey poj DFS
来源:互联网 发布:关系数据库设计理论 编辑:程序博客网 时间:2024/05/17 02:58
/*挺好的一道DFS。有几个trick。一个就是方向向量的顺序,不需要遍历每一个起始点,则需要按字母第一关键字,数字第二关键字进行向量方向的安排。然后就是图的行列问题。p行去列,实际上存图的时候是x<=q &&y<=p,这个细节要注意。*/#include <stdio.h>#include <cstring>bool vis[30][30];int ansx[1001];int ansy[1001];int p,q;bool ret;int dx[]= {-2,-2,-1,-1,1,1,2,2};int dy[]= {-1,1,-2,2,-2,2,-1,1};void dfs(int x,int y,int t){ int tempx,tempy; ansx[t]=x; ansy[t]=y; if(t==p*q) { ret=true; return ; } for(int i=0; i<8; i++) { tempx=x+dx[i]; tempy=y+dy[i]; if(tempx>=1&&tempx<=q&&tempy>=1&&tempy<=p&&!vis[tempx][tempy]&&!ret) { vis[tempx][tempy]=true; dfs(tempx,tempy,t+1); vis[tempx][tempy]=false; } }}int main(){ int t,ca=1; scanf("%d",&t); while(t--) { scanf("%d%d",&p,&q); printf("Scenario #%d:\n",ca++); memset(vis,false,sizeof(vis)); memset(ansx,0,sizeof(ansx)); memset(ansy,0,sizeof(ansy)); ret=false; vis[1][1]=true; dfs(1,1,1); if(!ret) printf("impossible\n"); else { for(int i=1; i<=p*q; i++) printf("%c%d",char(ansx[i]+'A'-1),ansy[i]); printf("\n"); } printf("\n"); } return 0;}