码迷,mamicode.com
首页 > 其他好文 > 详细

2016暑假集训补题系列——POJ 1475

时间:2016-08-26 13:46:56      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

POJ 1475 Pushing Boxes

题意:模拟推箱子游戏给出一个二维图,S表示人的位置,B表示箱子位置,T表示目标位置。要求最短输出路径大写字母代表推,小写字母代表走。

思路:BFS+BFS,首先对箱子进行BFS,每一次在加入新的节点时对人再进行一次BFS,找到他走到需要推箱子的地方的最小路径。(最开始不知道怎么记录路径,之前也几乎不用String,结果如此好用,还可以直接加。。。)

技术分享
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<vector>
using namespace std;
char s[30][30],n,m;
int bx,by,sx,sy,tx,ty;
int fx[]={-1,1,0,0};
int fy[]={0,0,-1,1};
int vis[30][30][4],vis2[30][30];
char ch[]={N,S,W,E};
char ch2[]={n,s,w,e};
struct node{
    int x,y;//箱子位置
    int sx,sy;//人的位置
    string path;//路径
};
bool in(int x,int y) { return x>=0&&y>=0&&x<n&&y<m; }
bool bfs2(int ex,int ey,int bbx,int bby,int ssx,int ssy,string &str){
    //分别代表这次人移动目标位置,箱子在哪里(不能走),人在哪里和路径。
    memset(vis2,0,sizeof(vis2));
    queue<node> qs;
    node no;
    no.x=ssx;
    no.y=ssy;
    no.path=str;
    qs.push(no);
    while(!qs.empty()){
        node us=qs.front();
        qs.pop();
        if(us.x==ex&&us.y==ey){
            str=us.path;
            return true;
        }
        for(int i=0;i<4;i++){
            int xx=fx[i]+us.x;
            int yy=fy[i]+us.y;
            if(xx==bbx&&yy==bby) continue;
            if(!vis2[xx][yy]&&in(xx,yy)&&s[xx][yy]!=#){
                vis2[xx][yy]=1;
                node no1;
                no1.x=xx;
                no1.y=yy;
                no1.path=us.path+ch2[i];
                qs.push(no1);
            }
        }
    }
    return false;
}
bool bfs(){
    memset(vis,0,sizeof(vis));
    queue<node> qb;
    node no;
    no.x=bx;
    no.y=by;
    no.sx=sx;
    no.sy=sy;
    no.path="";
    qb.push(no);
    while(!qb.empty()){
        node ub=qb.front();
        qb.pop();
        if(ub.x==tx&&ub.y==ty){
            cout<<ub.path<<endl;
            return true;
        }
        for(int i=0;i<4;i++){
            int xx=fx[i]+ub.x;
            int yy=fy[i]+ub.y;
            if(in(xx,yy)&&(!vis[xx][yy][i])&&(s[xx][yy]!=#)){
                vis[xx][yy][i]=1;
                string temp=ub.path;
                if(bfs2(ub.x-fx[i],ub.y-fy[i],ub.x,ub.y,ub.sx,ub.sy,temp)){
                    node no1;
                    no1.x=xx;
                    no1.y=yy;
                    no1.sx=ub.x;
                    no1.sy=ub.y;
                    no1.path=temp+ch[i];
                    qb.push(no1);
                }
            }
        }
    }
    return false;
}
int main(){
    int t=0;
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++)
            scanf("%s",s[i]);
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            if(s[i][j]==S){
                sx=i; sy=j;
            }
            else if(s[i][j]==B){
                bx=i; by=j;
            }
            else if(s[i][j]==T){
                tx=i; ty=j;
            }
        }
        t++;
        printf("Maze #%d\n",t);
        if(!bfs())
            printf("Impossible.\n");
        cout<<endl;
    }

    return 0;
}
Psong

 

2016暑假集训补题系列——POJ 1475

标签:

原文地址:http://www.cnblogs.com/N-Psong/p/5809955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!