bfs救命
  • 板块学术版
  • 楼主guoshi
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/7/12 20:11
  • 上次更新2023/11/3 10:14:43
查看原帖
bfs救命
945842
guoshi楼主2023/7/12 20:11

现在有一个 的地图,问从起点(sx,sy) 到(tx,ty)

最少要走几步。 输入格式

第一行一个正整数。

接下来 n行,每行n个字符表示的矩阵,1表示不能通过, 0表示可以通过。

最后一行四个整数

。

输出格式

仅有一个数,表示答案。 样例 样例输入

5

01111

00111

10001

11101

11100

1 1 5 5

样例输出

8

#include<bits/stdc++.h>
using namespace std;
int n,sx,sy,tx,ty;
char a[1050][1050];
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[1050][1050];
struct node{
	int x,y,tot;
};
queue<node>q;
bool cmp(int a,int b){
	return a>=1&&a<=n&&b>=1&&b<=n;
}
int main(){
//	memset(vis,-1,sizeof(vis));
	scanf("%d",&n);
	string nm;
	getline(cin,nm);
	for(int i=1;i<=n;i++){
		string st="";
		getline(cin,st);
		for(int j=1;j<=n;j++)
			a[i][j]=st[j-1];
	}		
	scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++)
//			cout<<a[i][j];
//		cout<<endl;
//	}	
	q.push((node){sx,sy,0});
	vis[sx][sy]=1;
	while(!q.empty()){
		node now=q.front();
		q.pop();
		int nx=now.x,ny=now.y,s=now.tot;
//		if(a[nx][ny]=='1') continue;
//		cout<<nx<<' '<<ny<<' '<<s<<endl;
		if(nx==tx&&ny==ty){
			cout<<s;
			return 0;
		}
		for(int i=0;i<4;i++){
			int dx=nx+walk[i][0],dy=ny+walk[i][1];
//					cout<<nx<<' '<<ny<<endl;
			if(cmp(dx,dy)&&a[dx][dx]!='1'&&vis[dx][dy]==0){
				vis[dx][dy]=1;
				q.push((node){dx,dy,s+1});
			}
		}
		
	}
	cout<<-1;
	return 0;
}
2023/7/12 20:11
加载中...