T-TPOJ3083

好吧,让我一点一点变强大,每一天都被很小的一个错误折磨……


注意那个图的输入!!!!长和宽要注意!!!!!
dfs的出口要注意!!!! 

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
int sx,sy,ex,ey;
char room[41][41];
struct node
{
    int x,y;
    int step;
} queue[800];
int vis[41][41];
int move[2][8][2]= {{{0,-1},{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0}},{{0,1},{-1,0},{0,-1},{1,0},{0,1},{-1,0},{0,-1},{1,0}}};
//方向上的处理,一个是左优先,一个是右优先 这里重复了一次是因为并不确定开始时S的方向,看下面代码 
int dx[4]= {-1,1,0,0};
int dy[4]= {0,0,-1,1};
int dfs(int k)
{
    int d=0;
    int i;
    int step=1;
    int x=sx,y=sy;
    while(room[x][y]!='#'&&room[x][y]!='E')   //dfs的出口!!!!当走到E
    {
        for(d=(d+3)%4,i=d; i<d+4; i++)
        {
            int tx=x+move[k][i][0];
            int ty=y+move[k][i][1];
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&room[tx][ty]!='#')
            {
                x=tx;
                y=ty;
                d=i%4;  //方向处理
                step++;
                break;  //检查当前tx,ty是否为终点
            }
        }
    }
    return step;
}
int bfs()
{
    int front=0,back=0;
    queue[back].x=sx;
    queue[back].y=sy;
    queue[back++].step=1;
    vis[sx][sy]=1;
    while(front<=back)
    {
        int xx=queue[front].x;
        int yy=queue[front].y;
        for(int i=0; i<4; i++)
        {
            int tx=xx+dx[i];
            int ty=yy+dy[i];
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&room[tx][ty]!='#'&&!vis[tx][ty])
            {
                vis[tx][ty]=1;
                queue[back].x=tx;
                queue[back].y=ty;
                queue[back].step=queue[front].step+1;
                if(tx==ex&&ty==ey) return queue[back].step;
                back++;
            }
        }
        front++;
    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&n);
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                cin>>room[i][j];
                if(room[i][j]=='S')
                {
                    sx=i,sy=j;
                }
                if(room[i][j]=='E')
                {
                    ex=i;
                    ey=j;
                }
            }
        printf("%d ",dfs(0));
        printf("%d ",dfs(1));
        printf("%d\n",bfs());
    }
}

你可能感兴趣的:(T-TPOJ3083)