标签:dfs
背景:就是简单的遍历全图搜索,但要注意两点:
1.一开始以为起点不同会有不同结果,所以就枚举了起点,但实际上只要能遍历全图就能把A1作为起点,因为遍历全图就是每个点都要走到,那么A1也要走到,既然可以走到A点,那么也可以从A点走到其它点。
2.题目中的字典序输出,不看看很能想到题意是先满足列,然后满足行,这样写出满足条件的方向数组即可。
//poj 2488 #include<map> #include<set> #include<stack> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define M 30 #define INF 100000000 #define LL long long int using namespace std; int n,m,dir[8][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2}; struct diagram{int last,ok;}visit[M][M],temp1,temp2; bool flag; bool check(void){ int x=0; for(int i=1;i <= n;i++) for(int j=1;j <= m;j++) x+=visit[i][j].ok; return x == 0; } void print(int x,int y){ stack<diagram> s; while(true){ temp1.last=x; temp1.ok=y; if(visit[x][y].last == -1){ s.push(temp1); break; } int temp=visit[x][y].last; s.push(temp1); x-=dir[temp][0]; y-=dir[temp][1]; } while(!s.empty()){ temp2=s.top(); s.pop(); printf("%c%d",temp2.ok+'A'-1,temp2.last); } printf("\n"); } void dfs(int x,int y){ if(flag) return; visit[x][y].ok=0; if(check()){ flag=true; print(x,y); return; } for(int i=0;i < 8;i++){ int xx=x+dir[i][0],yy=y+dir[i][1]; if( xx >= 1 && xx <= n && yy >= 1 && yy <= m && visit[xx][yy].ok == 1){ visit[xx][yy].last=i; dfs(xx,yy); } } visit[x][y].ok=1; return; } void memset_visit(void){ for(int i=1;i <= n;i++) for(int j=1;j <= m;j++) visit[i][j].last=visit[i][j].ok=1; } int main(void){ int count=1,t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); printf("Scenario #%d:\n",count++); flag=false; memset_visit(); visit[1][1].last=-1; dfs(1,1); if(!flag) printf("impossible\n"); printf("\n"); } return 0; }
标签:dfs
原文地址:http://blog.csdn.net/jibancanyang/article/details/44463669