POJ 2935 (BFS)

可以将图看成每一条边都是一个节点,这样就将6*6的图构成13*13的一个图,然后模拟即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
using namespace std;

struct node{
    int x;
    int y;
    string s;
    node(int a,int b):x(a),y(b){}
};

int main()
{
    bool vis[13][13];
    int sx,sy,ex,ey;
    while(scanf("%d%d",&sy,&sx)!=EOF&&(sy||sx)){
        scanf("%d%d",&ey,&ex);
        mm(vis,0);
        sy=2*sy-1;
        sx=2*sx-1;
        ex=2*ex-1;
        ey=2*ey-1;
        for(int i=0;i<13;i++){
            vis[0][i]=1;
            vis[i][0]=1;
            vis[i][12]=1;
            vis[12][i]=1;
        }
        int a,b,c,d;
        for(int i=0;i<3;i++){
            scanf("%d%d%d%d",&a,&b,&c,&d);
            a*=2;b*=2;c*=2;d*=2;
            if(a==c){
                for(int j=b;j<=d;j++){
                    vis[j][a]=1;
                }
            }
            if(b==d){
                for(int j=a;j<=c;j++){
                    vis[b][j]=1;
                }
            }
        }
        queue<node> q;
        q.push(node(sx,sy));
        while(1){
            node t=q.front();
            q.pop();
            if(t.x==ex&&t.y==ey){
                printf("%s\n",t.s.c_str());
                break;
            }
            if(!vis[t.x][t.y+1]){
                node f(t.x,t.y+2);
                f.s=t.s+"E";
                q.push(f);
                vis[t.x][t.y+1]=1;
                vis[t.x][t.y+2]=1;
            }
            if(!vis[t.x][t.y-1]){
                node f(t.x,t.y-2);
                f.s=t.s+"W";
                q.push(f);
                vis[t.x][t.y-1]=1;
                vis[t.x][t.y-2]=1;
            }
            if(!vis[t.x+1][t.y]){
                node f(t.x+2,t.y);
                f.s=t.s+"S";
                q.push(f);
                vis[t.x+1][t.y]=1;
                vis[t.x+2][t.y]=1;
            }
            if(!vis[t.x-1][t.y]){
                node f(t.x-2,t.y);
                f.s=t.s+"N";
                q.push(f);
                vis[t.x-1][t.y]=1;
                vis[t.x-2][t.y]=1;
            }
        }
    }
    return 0;
}
阅读更多

扫码向博主提问

杨美人

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • algorithm
  • 数据结构
去开通我的Chat快问
个人分类: 图论 搜索
上一篇Ural 1024 (拓扑排序----删边法)
下一篇UVA 208(dfs+剪枝)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭