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 leaving somewhere else. We are only interested in the cycles. In our example, there are two of them.

Your task is to write a program that counts the cycles and finds the length of the longest one. The length is defined as the number of small squares the cycle consists of (the ones bordered by gray lines in the picture). In this example, the long cycle has length 16 and the short one length 4.

Input

The input contains several maze descriptions. Each description begins with one line containing two integers w and h ( ), the width and the height of the maze. The next h lines represent the maze itself, and contain w characters each; all these characters will be either ``/" or ``\".

The input is terminated by a test case beginning with w = h = 0. This case should not be processed.

Output

For each maze, first output the line ``Maze #n:'', where n is the number of the maze. Then, output the line ``kCycles; the longest has length l.'', where k is the number of cycles in the maze and l the length of the longest of the cycles. If the maze does not contain any cycles, output the line ``There are no cycles.".

Output a blank line after each test case.

Sample Input

6 4
\//\\/
\///\/
//\\/\
\/\///
3 3
///
\//
\\\
0 0

Sample Output

Maze #1:
2 Cycles; the longest has length 16. Maze #2:
There are no cycles.

题意:输入'/'、'\'组合成一个迷宫。。要找出迷宫中可以形成回路的回路个数和回路中最长的回路长度。。。

思路:这里用了2个方法。。。

第一个方法是: 把迷宫每一个格子转换成3 *3的格子。。斜线的格子用1表示,其余用0表示,每个格子保存好后。在新的地图进行搜索。这样就可以广搜BFS。如果地图中为0点的点可以走出边界。就是不可能形成回路。

如果不会走出边界。就必然可以形成回路,每次搜完一点后,把相邻的一片标记掉。就不用重复搜索了。如果搜索到可以形成回路的。他的长度为走过的格子数除以3。

#include <stdio.h>
#include <string.h> int n, m;
int d[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int map[275][275];
int maxx;
char sb; struct Q
{
int x;
int y;
} q[66666]; int vis[275][275];
int numc; void bfs(int x, int y)
{
memset(q, 0, sizeof(q));
memset(vis, 0, sizeof(vis));
int h = 0;
int r = 1;
int num = 1;
q[h].x = x;
q[h].y = y;
vis[x][y] = 1;
while (h < r)
{
for (int i = 0; i < 4; i ++)
{
int xx = q[h].x + d[i][0];
int yy = q[h].y + d[i][1];
if (xx < 0 || xx >= 3 * n || yy < 0 || yy >= 3 * m)
{
return;
}
if (map[xx][yy] == 0 && vis[xx][yy] == 0)
{
vis[xx][yy] = 1;
q[r].x = xx;
q[r].y = yy;
num ++;
r ++;
}
}
h ++;
}
numc ++;
if (maxx < num / 3)
maxx = num / 3;
} void bfs2(int x, int y)
{
memset(q, 0, sizeof(q));
int h = 0;
int r = 1;
q[h].x = x;
q[h].y = y;
map[x][y] = 1;
while (h < r)
{
for (int i = 0; i < 4; i ++)
{
int xx = q[h].x + d[i][0];
int yy = q[h].y + d[i][1];
if (map[xx][yy] == 0 && xx >= 0 && xx < 3 * n && yy >= 0 && yy < 3 * m)
{
map[xx][yy] = 1;
q[r].x = xx;
q[r].y = yy;
r ++;
}
}
h ++;
}
}
int main()
{
int tt = 1;
while (scanf("%d%d", &m, &n) != EOF && n + m)
{
maxx = 0;
numc = 0;
memset(map, 0, sizeof(map));
getchar();
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
scanf("%c", &sb);
if (sb == '\\')
{
map[i * 3][j * 3] = 1;
map[i * 3 + 1][j * 3 + 1] = 1;
map[i * 3 + 2][j * 3 + 2] = 1;
}
if (sb == '/')
{
map[i * 3][j * 3 + 2] = 1;
map[i * 3 + 1][j * 3 + 1] = 1;
map[i * 3 + 2][j * 3] = 1;
}
}
getchar();
}
for (int i = 0; i < 3 * n; i ++)
{
for (int j = 0; j < 3 * m; j ++)
{
if (map[i][j] == 0)
{
bfs(i, j);
bfs2(i, j);
}
}
}
printf("Maze #%d:\n", tt ++);
if (numc)
printf("%d Cycles; the longest has length %d.\n\n", numc, maxx);
else
printf("There are no cycles.\n\n");
}
return 0;
}

第二个方法是:跟物理中的光学有关。。其实可以把每个墙壁看成镜子,路径看成光线。光射入镜子以后反射的路径是唯一的。然后每次就按照这个路径搜索。。如果会射出边界。。那么这条路径不可取。如果回射回起点,表明有回路。。这个方法写起来比较烦。要考虑墙壁是‘\','/'和路径入射方向。。但是时间比上一个方法快了许多。

#include <stdio.h>
#include <string.h> int bo;
int n, m;
int xxx, yyy;
int www;
int numc;
int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
char map[80][80];
int vis[2][80][80];
int maxx;
void dfs(int x, int y, int f, int w, int bu)
{
if (x < 1 || x > n || y < 1 || y > m)
return;
if (bo == 0)
bo = 1;
else
{
if (x == xxx && y == yyy && w == www)
{
numc ++;
if (maxx < bu)
maxx = bu;
return;
}
}
vis[w][x][y] = 1;
int xx = x + d[f][0];
int yy = y + d[f][1];
if (f == 0)
{
if (map[xx][yy] == '\\')
{
dfs(xx, yy, 3, 1, bu + 1);
}
if (map[xx][yy] == '/')
{
dfs(xx, yy, 1, 1, bu + 1);
}
}
if (f == 1)
{
if (map[xx][yy] == '\\')
{
dfs(xx, yy, 2, 1, bu + 1);
}
if (map[xx][yy] == '/')
{
dfs(xx, yy, 0, 0, bu + 1);
}
}
if (f == 2)
{
if (map[xx][yy] == '\\')
{
dfs(xx, yy, 1, 0, bu + 1);
}
if (map[xx][yy] == '/')
{
dfs(xx, yy, 3, 0, bu + 1);
}
}
if (f == 3)
{
if (map[xx][yy] == '\\')
{
dfs(xx, yy, 0, 0, bu + 1);
}
if (map[xx][yy] == '/')
{
dfs(xx, yy, 2, 1, bu + 1);
}
}
}
int main()
{
int tt = 1;
while (scanf("%d%d", &m, &n) != EOF && n + m)
{
maxx = 0;
numc = 0;
getchar();
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i ++)
{
gets(map[i] + 1);
}
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
{
xxx = i; yyy = j;
if (vis[0][i][j] == 0)
{
www = 0;
bo = 0;
dfs(i, j, 0, 0, 0);
if (map[i][j] == '/')
{
bo = 0;
dfs(i, j, 3, 0, 0);
}
if (map[i][j] == '\\')
{
bo = 0;
dfs(i, j, 1, 0, 0);
}
}
if (vis[1][i][j] == 0)
{
www = 1;
if (map[i][j] == '/')
{
bo = 0;
dfs(i, j, 1, 1, 0);
}
if (map[i][j] == '\\')
{
bo = 0;
dfs(i, j, 3, 1, 0);
}
bo = 0;
dfs(i, j, 2, 1, 0);
}
}
printf("Maze #%d:\n", tt ++);
if (numc)
printf("%d Cycles; the longest has length %d.\n\n", numc / 2, maxx);
else
printf("There are no cycles.\n\n");
}
return 0;
}

UVA 705 Slash Maze的更多相关文章

  1. 705 - Slash Maze

    By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice little mazes. Her ...

  2. uva 705

    题意,给你迷宫算出其中个封闭空间的个数,以及求出所有封闭的空间的最大步长,但是给你的迷宫式“/”,“\”来标记的所以需要将每个格子分开来3*3的格子来算, 一开始按照2*2来算,2*2有临界情况不好算 ...

  3. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  4. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  5. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  6. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  7. 【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有 ...

  8. uva 784 Maze Exploration 染色 搜索水题 DFS

    染色问题,其实就是看看图上某一点能扩散多少. 用DFS解决,因为BFS不是很熟 =-=...以后要多练. 提交后32ms,优化了一下,在递归前进行判定,优化到22ms,不是优化的很好... 代码: # ...

  9. [UVA] 784 - Maze Exploration

      Maze Exploration  A maze of rectangular rooms is represented on a two dimensional grid as illustra ...

随机推荐

  1. 登陆shell与交互式非登陆shell的区别

    登录shell 所谓登录shell,指的是当用户登录系统时所取的那个shell,登录shell属于交互式shell. 登录shell将查找4个不同的启动文件来处理其中的命令. bash shell处理 ...

  2. git 日常使用

    git clone git checkout      git 删除 本地分支: git branch -d <本地分支名> git branch -D <本地分支名>(大写表 ...

  3. 「拒絕存取路徑 'C:\Users\xxx\AppData\Local\Temp\Temporary ASP.NET Files\apname\3a1b3704\f7fc6d0c\App_Code.l8ieogii.0.cs」的錯誤!

    修改web.config中的system.web->compilation tag中,多加入tempDirectory="可存取的目錄"   <system.web&g ...

  4. UVa 1599 (字典序最小的最短路) Ideal Path

    题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...

  5. ASP.NET Cache

    ASP.NET为了方便我们访问Cache,在HttpRuntime类中加了一个静态属性Cache,这样,我们就可以在任意地方使用Cache的功能. 而且,ASP.NET还给它增加了二个“快捷方式”:P ...

  6. OK335xS tmp75 Qt 温度读取

    /******************************************************************* * OK335xS tmp75 Qt 温度读取 * 说明: * ...

  7. 剑指Offer:找出数组中出现次数超过一半的元素

    题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...

  8. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  9. 《深入Java虚拟机学习笔记》- 第12章 整数运算

    Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢 ...

  10. ASP.Net MVC_DotNetZip简单使用方法,解决文件压缩的问题[转]

    准备工作: 在vs工具栏中找到NuGet   下载DotNetZip   现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. ? 1 2 3 4 5 6 7 8 9 10 11 ...