HDU 2216 简单bfs

简单bfs,只是状态稍微多了两个,四维的bfs,在扩展规则上加了一定的约束。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;

int dx0[] = {1,-1,0,0} , dx1[] = {-1,1,0,0};
int dy0[] = {0,0,1,-1} , dy1[] = {0,0,-1,1};
int n,m;
char graph[25][25];
bool vis[25][25][25][25];
int ax,ay,bx,by;

struct node{
    int x1,y1,x2,y2;
    int step;
};

bool judge(int x1,int y1,int x2,int y2){
    if(x1==x2 && y1==y2) return true;
    if(abs(x1-x2)==1 && y1==y2) return true;
    if(x1==x2 && abs(y1-y2)==1) return true;
    return false;
}

bool judge1(int x,int y){
    if(x<0 || y<0 || x>=n || y>=m || graph[x][y]=='X')
        return true; //不能走
    return false;
}

int bfs(){
    queue<node> q;
    node cur,next;
    memset(vis,false,sizeof(vis));
    cur.x1 = ax;
    cur.y1 = ay;
    cur.x2 = bx;
    cur.y2 = by;
    cur.step = 0;
    vis[ax][ay][bx][by] = true;
    q.push(cur);
    while(!q.empty()){
        cur = q.front();
        q.pop();
        if(judge(cur.x1,cur.y1,cur.x2,cur.y2))
            return cur.step;
        for(int i=0;i<4;i++){
            next = cur;
            next.x1 = cur.x1+dx0[i];
            next.y1 = cur.y1+dy0[i];
            next.x2 = cur.x2+dx1[i];
            next.y2 = cur.y2+dy1[i];
            next.step = cur.step+1;
            if(judge1(next.x1,next.y1))
                continue;
            if(judge1(next.x2,next.y2)){
                next.x2 = cur.x2;
                next.y2 = cur.y2; //若当前位置不能走,则停留在原地
            }
            if(vis[next.x1][next.y1][next.x2][next.y2])
                continue;
            vis[next.x1][next.y1][next.x2][next.y2] = true;
            q.push(next);
        }
    }
    return -1;
}

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%s",graph[i]);
            for(int j=0;j<m;j++){
                if(graph[i][j]=='Z'){
                    ax = i;
                    ay = j;
                    graph[i][j] = '.';
                }
                else if(graph[i][j]=='S'){
                    bx = i;
                    by = j;
                    graph[i][j] = '.';
                }
            }
        }
        int res = bfs();
        if(res==-1)
            printf("Bad Luck!\n");
        else
            printf("%d\n",res);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42246923/article/details/80774690
今日推荐