读入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;
}