标签: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