外站题10分求助
  • 板块题目总版
  • 楼主Lytnsmh
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/6/24 19:02
  • 上次更新2023/10/27 22:40:36
查看原帖
外站题10分求助
537146
Lytnsmh楼主2022/6/24 19:02
已知一N×N的迷宫,允许往上、下、左、右四个方向行走,现请你找出一条从左上角到右下角的最短路径。
输入
输入数据有若干行,第一行有一个自然数N(N≤20),表示迷宫的大小,其后有N行数据,每行有N个0或1(数字之间没有空格,0表示可以通过,1表示不能通过),用以描述迷宫地图。入口在左上角(1,1)处,出口在右下角(N,N)处。所有迷宫保证存在从入口到出口的可行路径。
输出
输出数据仅一行,为从入口到出口的最短路径(有多条路径时输出任意一条即可)。路径格式参见样例。
样例输入 Copy
4
0001
0100
0010
0110
样例输出 Copy
(1,1)->(1,2)->(1,3)->(2,3)->(2,4)->(3,4)->(4,4)
#include<sstream>
#include<bits/stdc++.h>
#include <string>
#include <iostream>
#define ll long long
using namespace std;
ll a[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,ye,xe,ys,xs,maxn=999999999,b[20][20];
bool f[20][20];
string s,strr;
string NumberToString(int i)
{
    stringstream ss;
    ss << i;
    return ss.str();
}
void dfs(ll x,ll y,string step,ll ans)
{
    int xx,yy;
    if(x==n&&y==n)
     {
        if(ans<maxn)
        {
            maxn=ans;
            s=step; 
            int numm=s.size()-2;
            numm=s.size()-2;
            strr=s.substr(0,numm);
            
        }
        return ;
     }
     for(int i=0;i<4;i++)
      {
        xx=x+a[i][0];
        yy=y+a[i][1];
          if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&b[xx][yy]==0&&f[xx][yy]==0)
           {
            f[xx][yy]=1;
            string se=NumberToString(xx);
            string sr=NumberToString(yy);
            dfs(xx,yy,step+'('+se+','+sr+")->",ans+1);
            f[xx][yy]=0;
           } 
      }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
     {
        for(int j=1;j<=n;j++)
         {
            char c;
            cin>>c;
            b[i][j]=c-48;
         }
     }
     f[1][1]=1;
     dfs(1,1,"",0);
     cout<<"(1,1)->";
     cout<<strr;   
    return 0;
}

@metaphysis

2022/6/24 19:02
加载中...