10分:警示后人
查看原帖
10分:警示后人
39050
雷雨9楼主2024/5/15 18:00

读入w,h后是双换行要

cin>>w>>h;getchar();getchar();

完整代码

#include <iostream>
using namespace std;
int w,h,ans=-100;
char z[250][100]={0};
int way[250][100]={0};//记录每个点到出口的最小值
int dx[]={0,-1,0,1};//右上左下逆时针
int dy[]={1,0,-1,0};
void dfs(int x,int y,int step){
    if(x<=1||x>=2*h+1||y<=1||y>=2*w+1){
         return;//出界
    }
    way[x][y]=step;
    for(int i=0;i<=3;i++){
        if(z[x+dx[i]][y+dy[i]]==' '){//没墙,可走
            if(way[x+dx[i]*2][y+dy[i]*2]>step+1||way[x+dx[i]*2][y+dy[i]*2]==0)//防止回头路
            dfs(x+dx[i]*2,y+dy[i]*2,step+1);
        }
    }
}
int main()
{
//freopen("D:\\vscode_program\\input.in","r",stdin);
//freopen("D:\\vscode_program\\output.out","w",stdout);
   
   cin>>w>>h;getchar();getchar();
   for(int i=1;i<=2*h+1;i++){
   for(int j=1;j<=2*w+3;j++)
   scanf("%c",&z[i][j]);

   }
   int num=1;
   int ex[5][5]={0};//存出口
   for(int i=1;i<=2*h+1;i++){//找到两个出口坐标
    if(num>2)break;
    if(z[i][1]==' '){
        ex[num][1]=i;
        ex[num][2]=2;
        num++;
    }
    if(z[i][2*w+1]==' '){
        ex[num][1]=i;
        ex[num][2]=2*w;
        num++;
    }
   }
   for(int j=1;j<=2*w+1;j++){
    if(num>2)break;
    if(z[1][j]==' '){
        ex[num][1]=2;
        ex[num][2]=j;
        num++;
    }
    if(z[2*h+1][j]==' '){
        ex[num][1]=2*h;
        ex[num][2]=j;
        num++;
    }
   }

   dfs(ex[1][1],ex[1][2],1);
   dfs(ex[2][1],ex[2][2],1);
   
    for(int i=2;i<=2*h+1;i+=2){
    for(int j=2;j<=2*w+1;j+=2)
        if(way[i][j]>ans)ans=way[i][j];
    }
    cout<<ans<<endl;
 /*  for(int j=1;j<=2*w+1;j++){
      cout<<j<<" ";
            if(j<10)cout<<" ";
   }
   cout<<endl;
  for(int i=1;i<=2*h+1;i++){
    for(int j=1;j<=2*w+1;j++){
        if(z[i][j]==' '){
            cout<<way[i][j]<<" ";
            if(way[i][j]<10)cout<<" ";
        }else{
            cout<<z[i][j]<<"  ";
        }
    }
    cout<<endl;
   }*/
   system("pause");
   return 0;
}

2024/5/15 18:00
加载中...