求助,第一次写BFS的题目,参考书上的题目写了个这个,求助下应该怎么改
  • 板块P1141 01迷宫
  • 楼主MOXCOOT
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/2/15 13:25
  • 上次更新2023/11/5 03:15:20
查看原帖
求助,第一次写BFS的题目,参考书上的题目写了个这个,求助下应该怎么改
419652
MOXCOOT楼主2021/2/15 13:25
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<cstring>
#include<queue>
#define MAX_N 1000
#define MAX_M 100000
#define INF 99999
using namespace std;
int dx[] = { -1,0,0,1 };
int dy[] = { 0,1,-1,0 };
typedef pair<int, int > P;
int n, m, nx, ny;
int cnt = 0;
char a[MAX_N][MAX_N];
P ps[MAX_M];
int d[MAX_N][MAX_N];
char fan(char x) {                              //做这样一个函数,方便由1取得0,由0取得1;蹲一个简单方法
	if (x == '1')
		return '0';
	else
		return '1';
}
int bfs(int x, int y) {                         //做这样一个BFS函数
	queue<P> que;                               //创建队列
	for (int i = 0; i < n; i++) {               //一开始设了一个d[][],用来存目标坐标与起始点的距离
		for (int j = 0; j < n; j++) {
			d[i][j] = INF;                      //一开始全部默认为无穷大
		}
	}
	que.push(P(x, y));                          //把起始点压入队列
	d[x][y] = 0;                                //距离为0
	while (que.size()) {                        //只要队列里还有东西就继续                               
		P p = que.front();                      //把队列里的第一个东西取出来
		que.pop();
		for (int i = 0; i < 4; i++) {           //向四周移动
			nx = p.first + dx[i];               //移动后的坐标
			ny = p.second + dy[i];
			if (0 > nx || nx > n || 0 > ny || ny > n || d[nx][ny] !=INF ) {
				continue;                       //越界或者已经走过的舍去
			}
			if (fan(a[nx][ny]) == a[x][y]) {    //如果满足条件(*)
				que.push(P(nx, ny));            //压入队列
				d[nx][ny] = d[p.first][p.second] + 1;
				                                //距离在原有的基础上+1
				cnt++;
			}
		}	
	}
	return cnt;
}
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < m; i++) {
		cin >> ps[i].first >> ps[i].second;
	}
	for (int i = 0; i < m; i++) {
		cout << bfs(ps[i].first - 1, ps[i].second - 1) << endl;
	}
}
2021/2/15 13:25
加载中...