题意:迷宫里有X作为墙,空格为可通过,*标记起点。然后需要你现在来刷墙,刷那些由起点可达的房间的墙,即找由起点可达的连通块。这里题目说墙是除几个字符之外的可打印字符,没有说是X。做题时当成了X,结果AC了~题目说到墙都是3格子宽1格子厚,好像也没什么用~
思路:输入时找到起点并记下,然后由起点深搜。
注意:从网站拷贝样例数据到txt时,它自动地少了很多空格,导致这个测试数据时不符合题意的。(不容易发现复制粘贴过程中少了很多空格~)这样的话,如果是我代码中dfx中的注释掉的那个 if 语句,程序就会崩溃。(原因是我之前初始化时用的是空字符初始化maze,然后被修改了的测试数据里导致有的空格字符上方是空字符~)
这里用字符X来初始化maze,由于X作为墙封闭了整个maze,就不再需要像之前几题那样在maze外围一圈 X 来避免判断坐标是否出界。这里直接可不用判断坐标是否出界。
不难,但那个崩溃调了好久,没想到是拷贝样例数据出了问题~
Code:
//#define LOCAL #include<stdio.h> #include<string.h> #define MAXH 35 #define MAXL 90 void dfs(int x,int y); char maze[MAXH][MAXL]; //int visit[MAXH][MAXL]; int dir[][4]={{-1,1,0,0},{0,0,-1,1}};//LRUD int main() { #ifdef LOCAL freopen("784.in","r",stdin); freopen("784.out","w",stdout); #endif int n; scanf("%d",&n); getchar(); while(n-->0) { memset(maze,'X',sizeof(maze)); char s[MAXL]; int h=0; int sx=0,sy=0; while(gets(s) && s[0]!='_')//是下划线_不是短线- {//printf("%s\n",s); int len=strlen(s); for(int i=0;i<=len;++i)//小于等于len,将最后的\0也赋到最后 { maze[h][i]=s[i]; if(maze[h][i]=='*') { sx=h; sy=i;} } h++; } strcpy(maze[h++],s); dfs(sx,sy); for(int i=0;i<h;++i) printf("%s\n",maze[i]); } return 0; } void dfs(int x,int y) { //if(maze[x][y]=='X'||maze[x][y]=='#'||maze[x][y]=='_') return ; if(maze[x][y]!=' ' && maze[x][y]!='*') return ; //visit[x][y]=1; maze[x][y]='#'; for(int i=0;i<4;++i) { int nx=x+dir[1][i];//行应该是加dir[0]即加y int ny=y+dir[0][i]; dfs(nx,ny); } }
原文地址:http://blog.csdn.net/buxizhizhou530/article/details/39052405