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

Copy

输出数据 1

(1,1)->(1,2)->(1,3)->(2,3)->(2,4)->(3,4)->(4,4)

Copy

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 条评论

目前还没有评论...