3 条题解

  • 6
    @ 2022-10-26 13:29:11
    #include<bits/stdc++.h>
    using namespace std;
    int r,c,dx[]={-1,0,0,1},dy[]={0,-1,1,0};
    char a[45][45];
    bool vis[45][45];
    struct Point{
        int x,y,step;
    };
    queue<Point> q;
    bool check(int x,int y){ // 检查该点(x,y)是否可以通行以及是否未走过
        return x>=1&&y>=1&&x<=r&&y<=c&&!vis[x][y]&&a[x][y]=='.';
    }
    int bfs(){
        vis[1][1]=1;
        q.push((Point){1,1,1}); // 点(1,1)为什么花了1步我不理解,0步是WA,1步是AC
        while(q.size()){
            Point now=q.front();
            q.pop();
            for(short i=0;i<4;i++){
                int nx=now.x+dx[i],ny=now.y+dy[i];
                if(check(nx,ny)){
                    if(nx==r&&ny==c)return now.step+1;
                    vis[nx][ny]=1;
                    q.push((Point){nx,ny,now.step+1});
                }
            }
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin>>r>>c;
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
                cin>>a[i][j];
        cout<<bfs();
        return 0;
    }
    
    • 1
      @ 2024-2-15 21:40:12

      深搜

      #include <bits/stdc++.h>
      using namespace std;
      int n,m,b[100][100];//b数组----用途如下
      /*
      储存最少步数(因为dfs第一次储存的不一定是最少的)
      这个数组初始值为最大数(INT_MAX)方便储存
      发现有步数更少的更新当前的值
      */
      char a[100][100];//a数组储存迷宫
      //方向数组(右,上,左,下)
      int fx[5]={0,0,1,0,-1};
      int fy[5]={0,1,0,-1,0};
      //递归深搜(dfs)
      void dfs(int x,int y,int k){k标记步数
      	b[x][y]=k;//上来先改标记数组为k
      	for (int i=1;i<=4;i++){//循环4次(四个方向)
              //tx,ty方向(不用说吧)
      		int tx=x+fx[i];
      		int ty=y+fy[i];
      		if (a[tx][ty]=='.'&&k+1<b[tx][ty])dfs(tx,ty,k+1);//如果没有出界&&这个是最优走法->递归(深度优先搜索)
      	}
      }
      int main(){
      	cin>>n>>m;//输入
      	for (int i=1;i<=n;i++){
      		for (int j=1;j<=m;j++){
      			cin>>a[i][j];//读入数组
      			b[i][j]=INT_MAX;//初始化b数组
      		}
      	}
      	dfs(1,1,1);函数!!!!
      	cout<<b[n][m];//输出最少步数
      	return 0;
      }
      

      广搜

      #include <bits/stdc++.h>
      using namespace std;
      int n,m,tx,ty;
      char a[110][110];
      int fx[5]={0,0,1,0,-1};
      int fy[5]={0,1,0,-1,0};
      struct bfs{
      	int x,y,ans;
      }r;
      queue<bfs>q;
      int main(){
      	cin>>n>>m;
      	for (int i=1;i<=n;i++){
      		for (int j=1;j<=m;j++)cin>>a[i][j];
      	}
      	r.x=r.y=r.ans=1;
      	q.push(r);
      	a[1][1]='#';
      	while(!q.empty()){
      		for (int i=1;i<=4;i++){
      			tx=q.front().x+fx[i];
      			ty=q.front().y+fy[i];
      			if (a[tx][ty]=='.'){
      				r.x=tx;
      				r.y=ty;
      				r.ans=q.front().ans+1;
      				q.push(r);
      				a[tx][ty]='#';
      			}
      			if (tx==n&&ty==m){
      				cout<<q.back().ans;
      				return 0;
      			}
      		}
      		q.pop();
      	}
      	return 0;
      }
      
      </span>
      • -8
        @ 2022-4-24 17:48:59

        写题解请注意

        鼓励大家写题解,但注意题解格式。

        题解一定要有思路解析或代码注释,能否让别人理解你的思路

        也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

        给代码两端加上这个会舒服一些

        ```cpp

        你的代码

        ```

        </span>

        这个点在键盘的左上角tab上面那个键,注意切换输入法

        #include<iostream>
        using namespace std;
        int main()
        {
            int n;
            cin>>n;//这是一个注释
            return 0;
        } 
        

        请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

        抄袭题解一经发现直接取消成绩。

        题解被删除的可能

        1. 代码不符合格式规范
        2. 没有思路讲解或者没有注释,
        3. 无意义的题解

        大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

        • 1

        【基础】走出迷宫的最少步数

        信息

        ID
        429
        时间
        1000ms
        内存
        128MiB
        难度
        5
        标签
        递交数
        177
        已通过
        74
        上传者