USACO maze1 BFS

USACO maze1 BFS

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

不写了很长的时间bfs该,很长一段时间的中间失误,当延期一次延伸成功的新节点的节点应该被标记为参观。否则,在某些情况下无限期延长队列。

输入一个小坑爹处理称号,能够进来当字符串被读取。然后用周围的墙上每个节点的数组变量的情况下,最后一次从搜索的两个出口。装满水,就拿小决赛两次值,然后取整个地图的最大值作为结果

/*
ID:kevin_s1
PROG:maze1
LANG:C++
*/

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <list>
#include <cmath>

using namespace std;

#define INF 9999999
#define MAXH 110
#define MAXW 50
#define MAXHH 250
#define MAXWW 100

//gobal variable====
int H, W;
int HH, WW;
string maze[MAXHH];
int G[MAXH][MAXW];
int Gtmp[MAXH][MAXW];
int wall[MAXH][MAXW][4];

struct entry{
	int x, y;
};

vector<entry> entrys;
int result;
int visited[MAXH][MAXW];

int direct[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
queue<entry> que;
//==================


//function==========
void print(){
	/*
	for(int i = 0; i < HH; i++){
		for(int j = 0; j < WW; j++){
			cout<<maze[i][j];
		}
		cout<<endl;
	}
	*/
	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++){
			cout<<Gtmp[i][j]<<"|"<<G[i][j]<<" ";
		}
		cout<<endl;
	}
}

void BFS(entry start){
	que.push(start);
	G[start.x][start.y] = 1;
	visited[start.x][start.y] = 1;
	while(!que.empty()){
		entry top = que.front();
		que.pop();
		for(int i = 0; i < 4; i++){
			if(wall[top.x][top.y][i] == 1){
				entry nw;
				nw.x = top.x + direct[i][0];
				nw.y = top.y + direct[i][1];
				if(nw.x < 1 || nw.x > H || nw.y < 1 || nw.y > W)
					continue;
				if(visited[nw.x][nw.y] == 0){
					G[nw.x][nw.y] = G[top.x][top.y] + 1; 
					que.push(nw);
					visited[nw.x][nw.y] = 1;
				}
			}
		}
	}
	return;
}
	
//==================

int main(){
	freopen("maze1.in","r",stdin);
	freopen("maze1.out","w",stdout);
	cin>>W>>H;
	HH = 2 * H + 1;
	WW = 2 * W + 1;
	getchar();
	for(int i = 0; i < HH; i++){
		getline(cin, maze[i]);
	}
	memset(wall, 0, sizeof(wall));
	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++){
			if(maze[2*i][2*j-1] == ' ')
				wall[i][j][0] = 1;
			if(maze[2*i-2][2*j-1] == ' ')
				wall[i][j][1] = 1;
			if(maze[2*i-1][2*j-2] == ' ')
				wall[i][j][2] = 1;
			if(maze[2*i-1][2*j] == ' ')
				wall[i][j][3] = 1;
		}
	}
	
	entry tmp;
	for(int i = 1; i <= H; i++){
		if(wall[i][1][2] == 1){
			tmp.x = i, tmp.y = 1;
			entrys.push_back(tmp);
		}
		if(wall[i][W][3] == 1){
			tmp.x = i, tmp.y = W;
			entrys.push_back(tmp);
		}
	}

	for(int j = 1; j <= W; j++){
		if(wall[1][j][1] == 1){
			tmp.x = 1, tmp.y = j;
			entrys.push_back(tmp);
		}
		if(wall[H][j][0] == 1){
			tmp.x = H, tmp.y = j;
			entrys.push_back(tmp);
		}
	}

	result = 0;
	memset(visited, 0, sizeof(visited));
	memset(G, INF, sizeof(G));
	BFS(entrys[0]);
	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++)
			Gtmp[i][j] = G[i][j];
	}
	memset(visited, 0, sizeof(visited));
	memset(G, INF, sizeof(G));
	BFS(entrys[1]);

	for(int i = 1; i <= H; i++){
		for(int j = 1; j <= W; j++){
			G[i][j] = min(G[i][j], Gtmp[i][j]);
			if(G[i][j] > result && G[i][j] != INF)
				result = G[i][j];
		}
	}


	cout<<result<<endl;
	return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117303.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【云栖精选12月刊】2017年,阿里巴巴开源那些事

    【云栖精选12月刊】2017年,阿里巴巴开源那些事

    2022年3月13日
  • 简述分组密码的加密分组链接模式的工作原理及其特点(密码学移位密码加密解密)

    密钥生成如何安全地生成密钥。即如何生成可信任的密钥,保证用户得到的密钥是安全的,生成密钥的机器或程序是可信的。 如何生成安全的密钥。安全的密钥没有统一准确的定义,但一般来说是指密钥抗猜测和抗穷举等针对密钥攻击的能力。涉及密钥长度和密钥强弱的问题。分组加密对称加密算法按其加密数据的方式一般来说可以分成两种类型:分组加密和序列加密。 分组加密又称为块加密,是将要处理的数据分成固定的长度,然后在这固定长度的数据上使用密码算法进行计算。 序列加密模式又称为流加密方式,是对要处理的数据按位(或字

    2022年4月13日
  • v3S驱动gt911触摸「建议收藏」

    v3S驱动gt911触摸「建议收藏」文章目录一、修改设备树二、编写驱动三、运行测试四、编译进内核1.拷贝文件2.修改对应的Makefile3.编译运行4.测试1.注释掉坐标信息五、移植tslib1.buildroot配置tslib2.配置tslib3.测试一、修改设备树在sun8i-v3s-licheepi-zero-dock.dts中添加pio节点(其实经过测试不添加也是可以的,后面会说)&pio{ /*按键*/ key_pins:key_pins@0{ pins=”PG2″;

    2022年6月15日
  • 整数规划matlab实例,整数规划matlab[通俗易懂]

    整数规划matlab实例,整数规划matlab[通俗易懂]整数规划matlabTag内容描述:1、例已知非线性整数规划为maxz=x12+x22+3×32+4×42+2×52-8×1-2×2-3×3-x4-2x5s.t.0xi99,i=1,2,5×1+x2+x3+x4+x5400x1+2×2+2×3+x4+6x58002x1+x2+6x3200x3+x4+5×5200(1)编写M文件mengte.m,定义目标函数f和约束向量函数g,程序如下:funct…

    2022年7月12日
  • web服务器监控工具[通俗易懂]

    web服务器监控工具[通俗易懂]监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。1.PerformanceCo-PilotPerformanceCo-Pilot,简称PCP,是一个系统性能和分析框架。它从多个主机整理数据并实时的分析,帮你识别不正常的表现模式。它也提供A

    2022年6月12日
  • 关于代理服务器的原理及用法「建议收藏」

    关于代理服务器的原理及用法「建议收藏」关于代理服务器的原理及用法一,什么是代理服务器(Proxy)?答:以类似代理人的身份去取的用户需要的数据。由于它的【代理】能力,使得我们可以透过代理服务器来达成防火墙与用户数据的分析。除此之外我们还可以借助代理服务器来达成节省带宽的目的,以及加快内部网络对因特网的万维网的访问速度。当客户端有因特网的数据要求时,Proxy会帮用户去向目的地取得用户所需要的数据。所以当客户端指定www的代理服务器之后,用户的所有www相关要求就会通过代理服务器去捉取。代理服务器会架设在整个区网的单点对外防火墙上头,而在区

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号