uva 705 Slash Maze 斜线迷宫

唉,上午一直不在状态,都没有好好思考,基本上算是看的题解,切记做题一定要专注,一定要多思考,不能轻易的看题解了,这道题可以把‘/‘和‘\‘转化,用0和1表示,

‘/‘表示为 :
‘\‘表示为

001
100

010
010

100
001

相当于扩大了三倍,最后结果除以三就ok了

然后就可以用普通的搜索求了,还是连通问题,注意一点只要是遍历到处于边缘的0就说明这个一定不是环,wa了一次,还是没注意到每组案例之间都有一个空行;休息会,再奋战。

上代码:(基本上跟别人写的一样

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[300][300];
char a[100];
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int w,h,flag,sum,ans;
void dfs(int x,int y)
{
	map[x][y] = 1;
	for(int i=0; i<4; i++)
	{
		int xx = x+dx[i];
		int yy = y+dy[i];
		if(xx>=0&&yy>=0&&xx<3*h&&yy<3*w)
		{
			if(map[xx][yy]==0)
			{
				sum++;
				dfs(xx,yy);
			}
		}
		else
		{
			flag = 0;
		}
	}
}
int main()
{
	int i,j;
	int num = 0;
	while(scanf("%d%d",&w,&h),w+h)
	{
		num++;
		getchar();
		memset(map,0,sizeof(map));
		for(i=0; i<h; i++)
		{
			gets(a);
			for(j=0; j<w; j++)
			{
				if(a[j]=='/')
				{
					map[3*i][3*j+2] = 1;
					map[3*i+1][3*j+1] = 1;
					map[3*i+2][3*j] = 1;
				}
				else
				{
					map[3*i][3*j] = 1;
					map[3*i+1][3*j+1] = 1;
					map[3*i+2][3*j+2] = 1;
				}
			}
		}
		/*for(i=0; i<3*h; i++)
		{
			for(j=0; j<3*w; j++)
			{
				printf("%d ",map[i][j]);
			}
			puts("");
		}*/
		int max = 0;
		ans = 0;
		for(i=0; i<3*h; i++)
		{
			for(j=0; j<3*w; j++)
			{
				if(map[i][j]==0)
				{
					sum = 1;
					flag = 1;
					dfs(i,j);
					if(flag == 1)
					{
						++ans;
						if(sum > max)
							 max = sum;
					}
				}
			}
		}
		printf("Maze #%d:\n",num);
		if(ans == 0)
		{
			printf("There are no cycles.\n");
		}
		else
		{
				printf("%d Cycles; the longest has length %d.\n",ans,max/3);
			//	printf("ans = %d\n",ans);
		}
		puts("");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 13:39:20

uva 705 Slash Maze 斜线迷宫的相关文章

Uva 705 - Slash Maze

  Slash Maze  By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice little mazes. Here is an example: As you can see, paths in the maze cannot branch, so the whole maze only contains cyclic paths and paths entering somewh

705 - Slash Maze

By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice little mazes. Here is an example: As you can see, paths in the maze cannot branch, so the whole maze only contains cyclic paths and paths entering somewhere and leavin

uva705 - Slash Maze 【转化+dfs】

题目:uva705 - Slash Maze 题意:给出一个迷宫,看题目给出的图就知道,由 \ 和 / 组成,让你求有几个环,然后最大的环由几个矩形组成. 分析:这是一道很灵活的题目,关键在于对题目给出图形的转化,例如' \ ' 可以转化为 1 0 0 0 1 0 0 0 1 而' / ' 可以转化为 0 0 1 0 1 0 1 0 0 然后直接广搜或者深搜都可以,找环就可以了.也可以转化为 2 * 2 的,需要特判. AC代码: #include <cstdio> #include <

3299: [USACO2011 Open]Corn Maze玉米迷宫

3299: [USACO2011 Open]Corn Maze玉米迷宫 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 137  Solved: 59[Submit][Status][Discuss] Description 今年秋天,约翰带着奶牛们去玩玉米迷宫.迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行. 迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口. 在这个迷宫里,有一些神奇的传送点6每个传送点

uva 705

题意,给你迷宫算出其中个封闭空间的个数,以及求出所有封闭的空间的最大步长,但是给你的迷宫式“/”,“\”来标记的所以需要将每个格子分开来3*3的格子来算, 一开始按照2*2来算,2*2有临界情况不好算(233333)…… 格式需要额外空一行…… 题很简单,就是dfs走出边界说明不是封闭的…… 不过就这样了……还是太弱了…… 话说,今天又颓了一天…… 233333333 代码…… #include <iostream> #include <cstdio> #include <c

[LeetCode] The Maze III 迷宫之三

There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolling up (u), down (d), left (l) or right (r), but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction. T

[LeetCode] The Maze II 迷宫之二

There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolling up, down, left or right, but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction. Given the ball's 

UVa 11624 大火蔓延的迷宫

https://vjudge.net/problem/UVA-11624 题意:有一个大火蔓延的迷宫,迷宫中有障碍格,而所有着火的格子都会往四周蔓延.求出到达边界格子时的最短时间. 思路:复杂了一点的迷宫. 在bfs之前,我们首先需要计算出火势蔓延的情况,火势每次向四周蔓延一个格子,所以这也是一个最短路问题,也用一次bfs,计算出每个空白格子着火时的时间.这样,当我们第二次bfs去计算走出迷宫的时间时,对于每一个可走的格子,我们只需要判断在此时该格子是否着火,如果还未着火,则该格子是可以走的.

uva 11624 大火蔓延的迷宫 Fire!(两次bfs)

 题目:一个平面迷宫中有一个人,迷宫中有些点起火了,火和人每个单位时间只能向相邻的格子移动, 其中有一些空间被墙壁占据,问这个人在不背或烧到的情况下,离开迷宫的最快时间. 思路是先用bfs预处理每个格子起火的时间,在来一次bfs走迷宫,入队时判断着火事件和父节点时间大小关系 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iost