1252:走迷宫

【题目描述】

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

【输入】

第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)

接下来是R行,每行C个字符,代表整个迷宫。

空地格子用‘.’表示,有障碍物的格子用‘#’表示。

迷宫左上角和右下角都是‘.’。

【输出】

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

【输入样例】

5 5
..###
#....
#.#.#
#.#.#
#.#..

【输出样例】

9

这题卡数据有点没必要 用cin 和 cout 是错误的 用 ios::sync_with_stdio(false)也是错误的

bfs

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int n,m;
int vis[N][N];
int u[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
    int x,y,step;
    node(){}
    node(int x1,int y1,int step1):x(x1),y(y1),step(step1){}
};
char mapp[N][N];
int cnt=1;
int  bfs(int x,int y,int step)
{
    vis[x][y]=1;
    queue<node>Q;
    Q.push(node(x,y,step));
    while(!Q.empty()){
        node a=Q.front();
        Q.pop();
        for(int i=0;i<4;i++){
            int xx=a.x+u[i][0];
            int yy=a.y+u[i][1];
            if((xx>=0&&xx<n)&&(yy>=0&&yy<m)&&!vis[xx][yy]&&(mapp[xx][yy]=='.')){
                if((xx==n-1)&&(yy==m-1)) return a.step+1;
                //cnt++;
                vis[xx][yy]=1;
                Q.push(node(xx,yy,a.step+1));
            }
        }
    }

}
int main()
{
    ios::sync_with_stdio(false);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",mapp[i]);
    }
    memset(vis,0,sizeof(vis));
    printf("%d\n",bfs(0,0,1));

    //cout<<cnt<<endl;
    return 0;
}

dfs

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int n,m;
int vis[N][N];
int u[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

char mapp[N][N];
int viss[N][N];
int cnt=1;
int minn=100;
void dfs(int x,int y,int step)
{
    if(step>=minn||step>=viss[x][y]) return;
    viss[x][y]=step;
    if((x==n-1)&&(y==m-1)){
        minn=min(minn,step);
    }
    else
    for(int i=0;i<4;i++){
            int xx=x+u[i][0];
            int yy=y+u[i][1];
            if((xx>=0&&xx<=n-1)&&(yy>=0&&yy<=m-1)&&!vis[xx][yy]&&(mapp[xx][yy]=='.')){
                vis[xx][yy]=1;
                dfs(xx,yy,step+1);
                vis[xx][yy]=0;
            }
        }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",mapp[i]);
    }
    memset(vis,0,sizeof(vis));
    memset(viss,0x3f3f3f3f,sizeof(viss));
    vis[0][0]=1;
    dfs(0,0,1);
    printf("%d\n",minn);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Wchenchen0/article/details/81347763