UVA705

题目的意思就是根据输入,找出有几个封闭的空间,最大的有多少个格子(提纲中中的正方向格子);

首先要先把每个格子变成3 × 3的;

例如,第一个符号是 ‘ \ ’; 那么就是第一行第一个,第二行第二个,第三行第三个都被标记为1了。

输入完之后,找到空格子,也就是0的时候,开始dfs()只需要搜四个方向。如果找到了边界,并且不是斜杠(不是1),说明不是封闭的,是通到外界的,也就不计位封闭空间。。。

另外每次开始dfs后,递归的次数就是格子的数量,当然还要除以三。


AC代码:


#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

const int  N = 1000;
int maze[3 * N][3 * N];
bool vis[3 * N][3 * N];
bool cir;
int n,m;
int count;
int d;
int res;
int T = 1;
int dis[3 * N];
int t;
void init () {
	cir = true;
	t = 0;
	d = 0;
	for (int i = 0; i < 3 * N;i++) {
		for (int j = 0; j < 3 * N ;j++) {
			maze[i][j] = 0;
			vis[i][j] = false;
		}
		dis[i] = 0;
	}
}
void dfs(int x, int y) {
	if (maze[x][y] == 1 || vis[x][y] == true)
		return ;
	if(x == 0 || y == 0 ||x == 3 * m - 1 ||y == 3 * n - 1) {
		cir = false;
		return ;
	}
	d++;
	vis[x][y] = true ;
	dfs(x - 1,y);
	dfs(x ,y - 1);
	dfs(x , y + 1);
	dfs(x + 1 , y);
}
int main () {
	while (cin >> n >> m ) {
		getchar();
		if (n == 0 && m == 0)
			break;
		init();
		char ch;
		for (int i = 0; i < 3 * m ;i += 3) {
			for (int j = 0 ; j < 3 * n ;j += 3) {
				ch = getchar();
				if (ch == '/') {
					maze[i][j + 2] = 1;
					maze[i + 1][j + 1] = 1;
					maze[i + 2][j] = 1;
				}
				if (ch == '\\') {
					maze[i][j] = 1;
					maze[i + 1][j + 1] = 1;
					maze[i + 2][j + 2] = 1;
				}

			}
			getchar();
		}
		for (int i = 0 ;i < 3 * m;i++) {
			for (int j = 0; j < 3 * n ;j++) {
				cir = true;
				d = 0;
				if (maze[i][j] == 0 && vis[i][j] == false) {
					dfs(i,j);
					if(cir == true) {
//						cout <<i<<" "<<j<<endl;
						dis[t++] = d / 3;
					}
					
				}				
			}
		}
		int max = 0;
		for (int i = 0; i < t ;i++) {
			if (dis[i] > max)
				max = dis[i];
		}
		res = max;
		cout <<"Maze #" <<T++<<":"<<endl; 
		if(t == 0)
			cout <<"There are no cycles."<<endl<<endl;
		else
			cout << t <<" Cycles; the longest has length " << res <<"."<<endl<<endl;
		count = 0;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值