UVa784 Maze Exploration
[PDF Link]
Description
A maze of rectangular rooms is represented on a two dimensional grid as illustrated in figure 1a. Each point of the grid is represented by a character. The points of room walls are marked by the same character which can be any printable character different than `*', `_' and space. In figure 1 this character is `X'. All the other points of the grid are marked by spaces.XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX X X X X X X X###X###X###X X X X X X X X###########X X X X X X X X X X###X###X###X X X XXXXXX XXX XXXXXXXXXX XXXXXX#XXX#XXXXXXXXXX X X X X X X X X###X###X###X###X X X * X X X###############X X X X X X X X X###X###X###X###X XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXAll rooms of the maze are equal sized with all walls 3 points wide and 1 point thick as illustrated in figure 2. In addition, a wall is shared on its full length by the separated rooms. The rooms can communicate through doors, which are positioned in the middle of walls. There are no outdoor doors.
a) Initial maze b) Painted maze Figure 1. Mazes of rectangular roomsdoor | XX XX X . X measured from within the room door - ...-- walls are 3 points wide X . X__ XXXXX | |___ walls are one point thickYour problem is to paint all rooms of a maze which can be visited starting from a given room, called the `start room’ which is marked by a star (`*’) positioned in the middle of the room. A room can be visited from another room if there is a door on the wall which separates the rooms. By convention, a room is painted if its entire surface, including the doors, is marked by the character `#’ as shown in figure 1b.
Figure 2. A room with 3 doors
Input
The program input is a text file structured as follows: 1. The first line contains a positive integer which shows the number of mazes to be painted. 2. The rest of the file contains the mazes. The lines of the input file can be of different length. The text which represents a maze is terminated by a separation line full of underscores (`_'). There are at most 30 lines and at most 80 characters in a line for each maze The program reads the mazes from the input file, paints them and writes the painted mazes on the standard output.
Output
The output text of a painted maze has the same format as that which has been read for that maze, including the separation lines. The example below illustrates a simple input which contains a single maze and the corresponding output.
Sample Input
2 XXXXXXXXX X X X X * X X X X XXXXXXXXX X X X X X X XXXXX _____ XXXXX X X X * X X X XXXXX _____
Sample Output
XXXXXXXXX X###X###X X#######X X###X###X XXXXXXXXX X X X X X X XXXXX _____ XXXXX X###X X###X X###X XXXXX _____
这道题的主要意思是:一个人(用*表示)在一个迷宫了(用X表示墙,空格表示路),要求把这个人能走到的地方全部标记为#
先遍历一下迷宫,找到人所在的位置,然后以此为起点,用深度优先的方法遍历,把能走到的地方标记为#,,
代码少不了~~~ ㄟ(≧◇≦)ㄏ
#include<iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
using namespace std;
char c[33][82];
int vis[33][82];
int dir[4][2]={{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
int len;
inline bool is_wall(char ch)
{
if (isprint(ch) && ch != ' ' && ch != '*' && ch != '_')
{
return true;
}
return false;
}
void dfs(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx >= 0 && ny >= 0 && nx < len && ny < strlen(c[nx]) && c[nx][ny] != '#' && !is_wall(c[nx][ny]) && !vis[nx][ny])
{
vis[nx][ny] = 1;
c[nx][ny] = '#';
dfs(nx, ny);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif;
int n, i, j, x, y;
char *p;
scanf("%d", &n);
getchar();
while (n--)
{
i = 0;
bool find = false;
memset(c, 0, sizeof(c));
memset(vis, 0, sizeof(vis));
while (1)
{
gets(c[i]);
if (c[i][1] == '_')
break;
if (!find)
{
for (j = 0; j < strlen(c[i]); j++)
{
if (c[i][j] == '*')
{
find = true;
x = i;
y = j;
break;
}
}
}
i++;
}
len = i + 1;
dfs(x, y);
i = 0;
while(i < len)
{
puts(c[i++]);
}
}
return 0;
}