- 问答
why?
- 2023-9-29 12:54:25 @
P545这题全WA,为什么? 题目如下:
Background
Special for beginners, ^_^
Description
已知一N×N的迷宫,允许往上、下、左、右四个方向行走,现请你找出一条从左上角到右下角的最短路径。
Format
Input
输入数据有若干行,第一行有一个自然数N(N≤20),表示迷宫的大小,其后有N行数据,每行有N个0或1(数字之间没有空格,0表示可以通过,1表示不能通过),用以描述迷宫地图。入口在左上角(1,1)处,出口在右下角(N,N)处。所有迷宫保证存在从入口到出口的可行路径。
Output
输出数据仅一行,为从入口到出口的最短路径(有多条路径时输出任意一条即可)。路径格式参见样例。(有校验,任输出一种方案就可以了)
Samples
输入数据 1
4
0001
0100
0010
0110
输出数据 1
(1,1)->(1,2)->(1,3)->(2,3)->(2,4)->(3,4)->(4,4)
Limitation
1s, 1024KiB for each test case. 代码如下:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,sum;
}z[400];
queue<node>q;
queue<node>s;
int n,walk[4][2]={{-1,0},{1,0},{0,1},{0,-1}},ans=10086;
char w;
int a[22][22],b[22][22],num;
bool Q=false;
void dfs(int x,int y,int sum){
if(a[x][y]==-1||sum>ans)return;
else if(x==n&&y==n&&sum==ans){Q=true;return;}
else {
for(int i=0;i<4;++i)
if(a[x+walk[i][0]][y+walk[i][1]]==0){
a[x][y]=-1;
dfs(x+walk[i][0],y+walk[i][1],sum+1);
if(Q){s.push((node){x,y});return;}
a[x][y]=0;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
cin>>w;
if(w=='0')a[i][j]=0,b[i][j]=0;
}
q.push((node){1,1});
b[1][1]=-1;
while(!q.empty()){
node tmp=q.front();
q.pop();
if(tmp.x==n&&tmp.y==n)ans=min(tmp.sum,ans);
for(int i=0;i<4;++i){
int xx=tmp.x+walk[i][0],yy=tmp.y+walk[i][1];
if(b[xx][yy]==-1)continue;
q.push((node){xx,yy,tmp.sum+1});
b[xx][yy]=-1;
}
}
++ans;
dfs(1,1,1);
while(!s.empty()){
node tmp=s.front();
s.pop();
int x=tmp.x,y=tmp.y;
z[num].x=x;z[num].y=y;++num;
}
for(int i=num-1;i>=0;--i)
cout<<'('<<z[i].x<<','<<z[i].y<<")->";
cout<<'('<<n<<','<<n<<')';
}
/*
A:
4
0001
0100
0010
0110
B:
5
00110
10111
10011
11011
10000
C:
6
000000
000000
000000
000000
000000
000000
*/`
0 条评论
目前还没有评论...