您的位置:首页 > 其它

poj 2488 dfs

2015-03-19 20:08 323 查看
背景:就是简单的遍历全图搜索,但要注意两点:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: