The Maze Makers(csu1566)
1566: The Maze Makers
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 90 Solved: 33
[Submit][Status][Web Board]
Description
The Maze Makers is a publisher of puzzle books. One of their most popular series is maze books. They have a program that generates rectangular two-dimensional mazes like the one shown in Figure 1. The rules for these mazes are: (1) A maze has exactly two exterior cell walls missing, opening to two distinct terminal cells, (2) starting from any one cell, all other cells are reachable, (3) between any two cells in the maze there is exactly one simple path. Formally, a path is a sequence of cells where each cell and its successor on the path share an edge without a wall. A simple path is a path that never repeats a cell.
The Maze Maker program uses hexadecimal digits to encode the walls and passages of a maze. For each cell in the maze there is a corresponding hex digit. As shown in Figure 2, the 1's and 0's in the 4 digit binary representation of a hex digit correspond to the walls (1's) and passages (0's) for each cell in the maze. For example, the binary encoding for the hex digit B is 1011. Starting at the top of the cell and moving clockwise around it, this digit represents a cell with a wall at the top, a passage to the right and walls at the bottom and to the left. A path between two maze cells successively moves one cell up, down, left or right, going through passages only.
Figure 1: Sample Maze

Figure 2: Hex Code for Walls and Passageways

Figure 3: Maze with Cell Labels

Figure 3 shows the sample maze with the hexadecimal labels in each cell. For example, the hexadecimal digit E in the top-right cell indicates that it has a wall above it, to its right, below it, yet a passageway to its left. The hexadecimal digit 8 to its left indicates that its cell has only a wall above it. The inputs will always be self-consistent, in that the hexadecimal digits in neighboring cells will agree on whether they share a wall or passageway, and each input will always have precisely two terminal cells, each with one missing exterior wall.
Our sample maze is a legitimate maze in that all cells are reachable and there is a unique simple path between any pairs of cells in the maze. Your goal is to write a program that reads the hexadecimal descriptions of a potential maze and tests to determine if it is legitimate. If there is a problem, your program must report only the first problem, as detailed below in the section titled "Output".
Input
The input consists of the descriptions of one or more candidate mazes. Each maze description will start with two integers, H and W, indicating the height and width of the maze, respectively, such that 1 ≤ H ≤ 50 and 2 ≤ W ≤ 50. Following this first line will be H rows of hexadecimal digits, with each row consisting of W digits. The input is terminated with a line displaying a pair of zeros.
Output
For each candidate maze, the program should output the first one of the following statements that applies:
NO SOLUTION
UNREACHABLE CELL
MULTIPLE PATHS
MAZE OK
The classification statements are defined formally as follows:
NO SOLUTION - There is no path through the interior of the maze between the two exterior openings.
UNREACHABLE CELL - There is at least one cell in the maze that is not reachable by following passageways from either of the openings in the exterior walls of the maze.
MULTIPLE PATHS - There exists a pair of cells in the maze that have more than one simple path between them. Two simple paths are considered to be distinct if any part of the paths differ.
MAZE OK - None of the above problems exist.
Note well that for the second case given in the following examples, there is no path between the start and finish and there is an unreachable cell; the correct output should simply be NO SOLUTION, because that error message is listed first in the above list. Similarly, in the fourth example given, UNREACHABLE CELL is reported because that error has priority over the multiple paths.
Sample Input
6 7
9A8C98E
2E5753C
980A496
553C53C
53C75D5
3E3E363
3 3
F9A
D3E
3AC
1 8
3AAA8AAE
6 3
9AC
3C5
A24
9A6
5BC
3C7
5 4
8A8E
592C
5186
161C
3A63
5 4
8AAE
59AC
5386
1E1C
3A63
0 0
Sample Output
MAZE OK
NO SOLUTION
MAZE OK
UNREACHABLE CELL
MULTIPLE PATHS
MULTIPLE PATHS
HINT

Source
通过构图(用1表示墙,0表示通路),再转成dfs();
用一个father[]表示他的直接父结点,如果现在的点的直接父节点不是上一个父节点,那么vist[][]++;
如果,dfs()返回的值是false,表示没有路NO SOLUTION
如果,vist[][]>1表示有多路,MULTIPLE PATHS
如果最后有vist[][]==0,则说明有不能到达的点,则 UNREACHABLE CELL
都没有,则说明是:MAZE OK
转载请注明出处:
寻找&星空の孩子
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1566
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int N =;
struct node
{
int x,y;
};
int mmap[N][N],vist[N][N],father[N*N];
int mi,mj,x,y,l[];
void init(int num)
{
if(num>=&&num<=) l[]=;
else l[]=; if(num&) l[]=;
else l[]=; if(num<||num>&&num<) l[]=;
else l[]=; if(num==||num==||num==||num==||num==||num==||num==||num==) l[]=;
else l[]=;
}
void build()
{
if(mj>*y) mi+=,mj=;
mmap[mi][mj]=;
mmap[mi-][mj-]=mmap[mi-][mj+]=;
mmap[mi+][mj-]=mmap[mi+][mj+]=;
mmap[mi-][mj]|=l[];
mmap[mi][mj-]|=l[];
mmap[mi][mj+]|=l[];
mmap[mi+][mj]|=l[]; mj+=;
}
bool bfs()
{
node pre,now;
queue<node>q;
bool flag=false;
int dir[][]= {,,,-,,,-,};
memset(vist,,sizeof(vist));
for(int i=; i<x&&!flag; i++)
{
for(int j=; j<y&&!flag; j++)
{
if(i==||j==||i==x-||j==y-)
{
if(mmap[i][j]==)
{
memset(father,-,sizeof(father));//¸¸½áµã
now.x=i;
now.y=j;
q.push(now);
vist[i][j]=;
while(!q.empty())
{
pre=q.front();
q.pop();
for(int e=; e<; e++)
{
now.x=pre.x+dir[e][];
now.y=pre.y+dir[e][];
if(now.x>=&&now.x<x&&now.y>=&&now.y<y&&mmap[now.x][now.y]==)
{
if(vist[now.x][now.y]==)
{
vist[now.x][now.y]=;
father[now.x*y+now.y]=pre.x*y+pre.y;
if(now.x==||now.y==||now.x==x-||now.y==y-)
flag=;
q.push(now);
}
else if(father[pre.x*y+pre.y]!=now.x*y+now.y)
vist[now.x][now.y]++;
} }
} }
}
} }
return flag;
}
void print()
{
for(int i=; i<=x*; i++)
{
for(int j=; j<=y*; j++)
printf("%d ",mmap[i][j]);
printf("\n");
}
} int main()
{
char ch[];
while(scanf("%d%d",&x,&y),x+y)
{
mi=;
mj=;
memset(mmap,,sizeof(mmap));
for(int i=; i<x; i++)
{
scanf("%s",ch);
int tp;
for(int j=; j<strlen(ch); j++)
{
if(ch[j]>=''&&ch[j]<='')
tp=ch[j]-'';
else
tp=ch[j]-'A'+; init(tp);
build();
}
}
//print();
x=x*+;
y=y*+;
if(bfs())
{
int f[]= {};
for(int i=; i<x; i+=)
{
for(int j=; j<y; j+=)
{
if(vist[i][j]==)
f[]=;
else if(vist[i][j]>=)
f[]=;
}
}
if(f[])
{
printf("UNREACHABLE CELL\n");
continue;
}
if(f[])
{
printf("MULTIPLE PATHS\n");
continue;
}
printf("MAZE OK\n");
}
else printf("NO SOLUTION\n");
}
return ;
} /**************************************************************
Problem: 1566
User: aking2015
Language: C++
Result: Accepted
Time:44 ms
Memory:1200 kb
****************************************************************/
The Maze Makers(csu1566)的更多相关文章
- CodeForces 1292A NEKO's Maze Game(思维)
#include <stdio.h> #include <string.h> #include <iostream> #include <string> ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- make基础(转)
1. 基本规则 请点评 除了Hello World这种极简单的程序之外,一般的程序都是由多个源文件编译链接而成的,这些源文件的处理步骤通常用Makefile来管理.Makefile起什么作用呢?我们先 ...
- HDU 4044 GeoDefense(动态规划)
GeoDefense Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 广度优先搜索(BFS)——迷宫的最短路径
宽度优先搜索按照距开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. 宽度优先搜索介绍(一篇不错的文章). 题目描述: 给定一个大小为N*M的迷宫.迷宫有通道和墙 ...
- HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ)
HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- 【转】强化学习(一)Deep Q-Network
原文地址:https://www.hhyz.me/2018/08/05/2018-08-05-RL/ 1. 前言 虽然将深度学习和增强学习结合的想法在几年前就有人尝试,但真正成功的开端就是DeepMi ...
- 【强化学习】python 实现 q-learning 例五(GUI)
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10143579.html 感谢pengdali,本文的 class Maze 参考了他的博客, ...
- Delphi的程序单元、结构、基础知识(转)
Object Passal的程序结构很特殊,与其它语言如C++,Object Windows等结构都不同.一个Delphi程序由多个称为单元的源代码模块组成.使用单元可以把一个大型程序分成多个逻辑相关 ...
随机推荐
- linux下设置计划任务执行python脚本
linux下设置计划任务执行python脚本 简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自 ...
- js-function作用域
你能猜出先弹出什么吗? <!DOCTYPE html> <html lang="en"><head> <meta charset=&quo ...
- Oracle OMF管理数据文件
1.什么是OMF? Oracle managed file的缩写,简单的理解,就是oracle自己管理自己的文件,可以是dbf,redolog 等等,具体可以参考官方文档Adiministrator中 ...
- delphi如何在form显示出来后处理指定的事件(例如自动登录)
最近写一个delphi客户端,遇到一个自动登录问题,已经解决了思路如下: 1.在Form的oncreate事件中读取用户配置文件,检查及处理是否保存了用户密码,是否自动登录,如果需要自动登录, 自动登 ...
- WPF触发器(Trigger) - DataTrigger
官方文档中对DataTrigger的介绍 Represents a trigger that applies property values or performs actions when the ...
- 【接口时序】2、Verilog实现流水灯及与C语言的对比
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45 ...
- java 手动实现远程执行功能(深入理解java虚拟机)
1.功能类 功能类共有五,分别是: package org.jvm; import java.io.*; /** * 对字节数组操作的工具类 */ public class ByteUtils { ...
- 用redux-thunk异步获取数据
概述 最近学习redux,打算用redux-thunk给todo添加异步获取数据组件.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 在todo下方,我异步获取我的react博客的标题,点击 ...
- Python - 集成开发环境Pycharm的使用方法和技巧
PyCharm HomePage:PyCharm 我的Pycharm,我做主 Getting Started with PyCharm Pycharm使用技巧 Documentation & ...
- 使用Ansible实现数据中心自动化运维管理
长久以来,IT 运维在企业内部一直是个耗人耗力的事情.随着虚拟化的大量应用.私有云.容器的不断普及,数据中心内部的压力愈发增加.传统的自动化工具,往往是面向于数据中心特定的一类对象,例如操作系统.虚拟 ...