捞(快救救我!!!!!悬棺)
  • 板块灌水区
  • 楼主see_htdls
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/7/17 20:51
  • 上次更新2024/7/17 22:05:22
查看原帖
捞(快救救我!!!!!悬棺)
716862
see_htdls楼主2024/7/17 20:51

老师发的作业BFS,今天晚上要交,我都快被哭 能回答一个都行 o(╥﹏╥)o了(爱博士,为什么输出全都是0,还有第三个连输入都无法结束)

//输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中黑色连通块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个联通块。如下图所示的图形有3个联通块。
//输入
//第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。
//输出
//输出连通块的个数
//样例		
//输入复制
6
100100
001010
000000
110000
111000
010100
//输出复制
//3
#include<bits/stdc++.h>
using namespace std;
int a[705][705],n,m,cnt;
bool f[705][705];
int dx[8]={1,1,1,0,0,-1,-1,-1};
int dy[8]={1,0,-1,-1,1,1,0,-1};
queue<int> dx,dy;
void bfs(int x,int y){
	cnt++;
	dx.push(x);
	dy.push(y);
	while(!dx.empty()&&!dy.empty()){
			int t_x=dx.front();
			int t_y=dy.front();
			for(int i=0;i<8;i++){
				//未完成 
			}

		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1&&f[i][j]==0) bfs(i,j);
		}
	}
	return 0;
}
//农场主约翰给他的农场买了W * H像素的卫星照片(1 <= W <= 80, 1 <= H <= 1000),希望找出最大的"连续的"(互相连接的)牧场。对于一个牧场的任何一对像素,其中一个像素如果能横向的或纵向的与属于这个牧场的另一个像素相连,这样的牧场称作是连续的。(很容易创建形状稀奇古怪的牧场,甚至是围着其它圆圈的圆圈。)
//每一张照片都数字化的抽象了,牧场区显示为"*", 非牧场区显示为"."。下面是一个10 * 5的卫星照片样例:
//这张照片显示了大小分别为4、16、6个像素的连续牧场区。帮助农场主约翰在他的每张卫星照片中找到最大的连续牧场。
//输入格式:第 1 行 : 两个由空格分开的整数,W 和 H 。第 2 到 H + 1 行 : 每一行包含 W 个 "*" 或者".",代表卫星照片的横向行。
//输出格式:一行为最大连续牧场的大小。
//样例输入:
//10 5
..*.....* *
.* * ..* * ***
.*...*....
..* * **.* * *
..* * **.* * *
//样例输出:
//16
//不会写



//题目描述
//为了早日返回斯巴达,阿基达摩斯二世立即让所有的斯巴达勇士去需找迷宫的出口E。现在他们被困在迷宫的S点,迷宫中“.”表示空地,可以通过,“#”表示墙,不能通过,每次只能向上下左右四个方向移动,每移动一个单位距离需要耗费一个单位时间,所有斯巴达勇士的移动速度相同。现在请你计算一下他们最短需要多少时间才能找到迷宫的出口。
//PS:假设迷宫中每个点可以容纳的人数没有限制,每个斯巴达勇士的行动方向之间没有影响。
//输入格式
//第一行有一个整数t(0 = < t <= 100),代表有t组测试数据。
//	每组测试数据第一行输入三个数n, m, c, (2 = < m <= n <= 500, 100 = < c <= 10000)分别代表迷宫的长度和宽度,以及被困迷宫的斯巴达勇士数(不包括阿基达摩斯二世)。下面m行每行有n个字符用来表示迷宫地图。详细输入格式见样例。
//	输出
//	输出一个整数,表示找到迷宫出口的最短时间,每组输出占一行。如不能找到出口输入 - 1
//	样例输入
1
5 5 100
#####
#S..#
#...#
#...E
#####
//	样例输出
5
//

  
  
  
  
#include<bits/stdc++.h>
using namespace std;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int w, h, cnt, xx, yy;
char a[25][25], vis[25][25];
typedef pair<int, int> PII;
queue<PII> q;
void bfs(int x, int y) {
	memset(vis, 0, sizeof(vis));
	q.push({ x,y });
	vis[x][y] = 1;
	while (!q.empty()) {
		auto p = q.front();
		for (int i = 0; i < 4; i++) {
			int tx = p.first + dx[i];
			int ty = p.second + dy[i];
			if (vis[tx][ty] == 0 && tx >= 0 && tx < h && ty >= 0 && ty < w && a[tx][ty] == '.') {
				q.push(PII(tx, ty));
				cnt++;
				vis[tx][ty] = 1;
			}
		}
		q.pop();
	}
}
int main() {
	cin >> w >> h;
	while (w || h) {
		cnt = 0;
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				cin >> a[i][j];
				if (a[i][j] == '@') {
					xx = i;
					yy = j;
				}
			}
		}

		bfs(xx, yy);
		cout << cnt + 1 << endl;
		cin >> w >> h;
	}
	return 0;
}
//	练习
//
//	题目描述
//	一艘远洋巨轮在大海中遇到故障,船长库克立刻发出了求救信号。距离最近的辽宁号收到了讯息,时间就是生命,必须尽快赶到那里。
//	通过侦测,辽宁号获取了一张海洋图。这张图将海洋部分分化成n * n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
//	为了尽快赶到出事地点,辽宁号最少需要走多远的距离。
//	输入
//	第一行为n, 下面是一个n* n的0、1矩阵,表示海洋地图
//	最后一行为四个小于n的整数,分别表示辽宁号和故障巨轮的位置。
//	【数据范围】
//
//	N≤1000
//	输出
//	辽宁号到故障巨轮的最短距离,答案精确到整数。
//	样例
//
//	输入
3 
001
101
100
1 1 3 3
//
  
 

#include<bits/stdc++.h>
using namespace std;
char maze[505][505], n, m, t;
int ex,ey,sx,sy;
int step[505][505],vis[505][505];
int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };
bool flag;
queue<int> qx, qy;
void bfs(int x,int y) {
	memset(step, 0, sizeof(step));
	memset(vis, 0, sizeof(vis));
	flag = 0;
	qx.push(x);
	qy.push(y);
	while (!qx.empty() && !qy.empty()) {
		int t_x = qx.front();
		int t_y = qy.front();
		for (int i = 0; i < 4; i++) {
			int tx = t_x + dx[i];
			int ty = t_y + dy[i];
			if(tx>=0&&tx<n&&ty>=0&&ty>m&&vis[tx][ty]==0&&maze[tx][ty]!='#'){	
				vis[tx][ty]=1;
				
				step[tx][ty] = step[t_x][t_y] + 1;
				if (tx == ex && ty == ey) {
					flag = 1;
				}

			}
		}
		qx.pop();
		qy.pop();
	}
}
int main() {
	int d;
	cin >> t;
	for (int tt = 1; tt <= t; tt++) {
		cin >> n >> m>> d;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> maze[i][j];
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (maze[i][j] == 'S') {
					sx = i, sy = j;
				}
				else if (maze[i][j] == 'E') {
					ex = i, ey = j;
				}
			}
		}
		bfs(sx, sy);
		if (flag) {
			cout << step[ex][ey];
		}
		else {
			cout << -1;
		}
		cout << endl;
	}
	
	return 0;
}
2024/7/17 20:51
加载中...