UVA705

来源:互联网 发布:动漫设计软件有哪些 编辑:程序博客网 时间:2024/04/29 18:05

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

首先要先把每个格子变成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;elsecout << t <<" Cycles; the longest has length " << res <<"."<<endl<<endl;count = 0;}return 0;}


0 0
原创粉丝点击