您的位置:首页 > 其它

UVA705

2014-07-27 00:14 232 查看
题目的意思就是根据输入,找出有几个封闭的空间,最大的有多少个格子(提纲中中的正方向格子);

首先要先把每个格子变成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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: