POJ 3083.Children of the Candy Corn

深搜 + 广搜



解析:在一幅图里面,先按照优先向左的顺序走一次,得出总步数;再按照优先向右的顺序走一次,得出总步数;最后得出最少步数。



AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>

using namespace std;

char Maze[45][45];
int row,col,d1,d2;
int start[2],end[2],flag[45][45];
int dir1[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int dir2[4][2]={{-1,0},{0,-1},{1,0},{0,1}};

struct Point {
    int x,y;
    int step;
};

void Init() {
    memset(flag,0,sizeof(flag));
    scanf("%d%d",&col,&row);
    for(int i=0;i<row;i++) {
        scanf("%s",Maze[i]);
        for(int j=0;j<col;j++) {
            if(Maze[i][j]=='S') {
                start[0]=i;
                start[1]=j;
            }
            if(Maze[i][j]=='E') {
                end[0]=i;
                end[1]=j;
            }
            if(Maze[i][j]=='#')
                flag[i][j]=1;
        }
    }
    if(start[0]==0)
        d1=1;
    else if(start[1]==row-1)
        d1=3;
    else  if(end[1]==col-1)
        d1=2;
    else
        d1=0;
    if(start[0]==0)
        d2=1;
    else if(start[1]==row-1)
        d2=3;
    else  if(end[1]==col-1)
        d2=0;
    else
        d2=2;
}

int DFS(int x,int y,int d,int dir[][2]) {
    int step,tmpx,tmpy,tmp;
    if(x==end[0]&&y==end[1])
        return 1;
    for(int i=0;i<4;i++) {
        tmp=(d+i)%4;
        tmpx=x+dir[tmp][0];
        tmpy=y+dir[tmp][1];
        if(tmpx>=0&&tmpx<row&&tmpy>=0&&tmpy<col&&!flag[tmpx][tmpy])
            break;
    }
    step=DFS(tmpx,tmpy,(tmp+3)%4,dir)+1;
    return step;
}

int BFS() {
    queue<Point> Q;
    Point p;
    memset(flag,0,sizeof(flag));
    p.x=start[0];
    p.y=start[1];
    p.step=1;
    flag[p.x][p.y]=1;
    Q.push(p);
    while(!Q.empty()) {
        p=Q.front();
        Q.pop();
        if(p.x==end[0]&&p.y==end[1])
            return p.step;
        for(int i=0;i<4;i++) {
            Point tmp;
            tmp.x=p.x+dir1[i][0];
            tmp.y=p.y+dir1[i][1];
            if(tmp.x>=0&&tmp.x<row&&tmp.y>=0&&tmp.y<col&&!flag[tmp.x][tmp.y]&&Maze[tmp.x][tmp.y]!='#') {
                flag[tmp.x][tmp.y]=1;
                tmp.step=p.step+1;
                Q.push(tmp);
            }
        }
    }
    return 0;
}

int main() {

    int T;
    scanf("%d",&T);
    while(T--) {
        Init();
        printf("%d ",DFS(start[0],start[1],d1,dir1));
        printf("%d ",DFS(start[0],start[1],d2,dir2));
        printf("%d\n",BFS());
    }
    return 0;
}




你可能感兴趣的:(POJ 3083.Children of the Candy Corn)