UVa784 Maze Exploration(DFS)

   Maze Exploration

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             XXXXXXXXXXXXXXXXXXXXX
a) Initial maze                                 b) Painted maze

Figure 1. Mazes of rectangular rooms

All  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.

                     door
                       |
                     XX XX
                     X . X   measured from within the room
               door - ...--  walls are 3 points wide
                     X . X__
                     XXXXX  |
                       |___  walls are one point thick
Figure 2. A room with 3 doors

Your  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.

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
_____

 

 

分析:

由于输入行中含空格,用gets(),别忘了getchar()  !

 

#include<stdio.h>
#include<string.h>
int lin;
char s[100010][84];
void dfs(int x,int y)
{
	if(s[x][y]!=' ') return;
	s[x][y]='#';
	dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);
	dfs(x,y-1);                           dfs(x,y+1);
	dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);
}
int main()
{
	int cas,i,j;
	while(scanf("%d",&cas)!=EOF)
	{
		getchar();
		memset(s,0,sizeof(s));
		lin=0;
		while(cas--)
		{
			while(gets(s[lin++]),s[lin-1][0]!='_');
		}
		for(i=0;i<lin;i++)
		{
			for(j=0;j<strlen(s[i]);j++)
			{
				if(s[i][j]=='*')
				{
					s[i][j]=' ';
					dfs(i,j);
				}
			}
		}
		for(i=0;i<lin;i++)
		{
			printf("%s\n",s[i]);
		}
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值