栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

信息学奥赛一本通1329:细胞

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

信息学奥赛一本通1329:细胞

题目

信息学奥赛一本通(C++版)在线评测系统

思路

这是一道典型的bfs染色问题,先遍历数组,只要没有标记为1,就开始bfs染色,最后输出color数量

接下来,咱就来把代码拆开来看看:

1. 准备工作,设置地图数组,vis数组,还有bfs的偏移量

char a[11000][11000];  //地图
int vis[110][110];   //记录路径,有没有到过
int dx[4]={0,0,1,-1};  //偏移量
int dy[4]={1,-1,0,0};
int n,m,color=0;  //color染色数
//结构体
struct point{
	int x,y;
};

queue  q;  //bfs队列

2. main函数内部  重点讲讲后面的,先遍历地图,只要找到符合要求的(a不是0),而且没去过(vis是0),就开始bfs广度优先搜索

int main(){
	cin>>n>>m;
	for(int i=0;i>a[i][j];
		}
	}
	for(int i=0;i 

3. 具体bfs函数内部,具体看里面的注释

int bfs(int x,int y){
    //基本bfs
	point p;
	p.x=x;
	p.y=y;
	q.push(p);
	while(!q.empty()){  //当队列不为空
		point tmp=q.front();
		q.pop();  //记得pop弹出
		for(int i=0;i<4;i++){
			point np=tmp;
			np.x+=dx[i];  //偏移量
			np.y+=dy[i];
			if(np.x=0 && np.y=0 && vis[np.x][np.y]==0 && a[np.x][np.y]!='0'){
				//假如点坐标合法而且没去过
                q.push(np);
				vis[np.x][np.y]=vis[tmp.x][tmp.y]+1;  //记录步数
			}
		}
	}
	return -1;
}

4. 最终ac代码

#include 
using namespace std;

char a[11000][11000];
int vis[110][110];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m,color=0;

struct point{
	int x,y;
};

queue  q;
struct point{
	int x,y;
};

queue  q;

int bfs(int x,int y){
	point p;
	p.x=x;
	p.y=y;
	q.push(p);
	while(!q.empty()){
		point tmp=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			point np=tmp;
			np.x+=dx[i];
			np.y+=dy[i];
			if(np.x=0 && np.y=0 && vis[np.x][np.y]==0 && a[np.x][np.y]!='0'){
				q.push(np);
				vis[np.x][np.y]=vis[tmp.x][tmp.y]+1;
			}
		}
	}
	return -1;
}

int main(){
	cin>>n>>m;
	for(int i=0;i>a[i][j];
		}
	}
	for(int i=0;i 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号