http://blog.csdn.net/f_zyj/article/details/50369168
我是在上面的这个地址看到的问题,贴一下地址。
题目:
问题描述:
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖,你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请你写出一个程序,计算你总共能达到多少块黑色瓷砖。
输入数据:
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别代表x方向和y方向瓷砖的数量。W和H都不超过20.接下来的H行中,每行包括W各字符。每个字符表示一块瓷砖的颜色,规则如下:
‘$’:黑色的瓷砖
‘#’:白色的瓷砖
‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集上唯一出现一次。
当在一行读出的两个零时,表示输入结束。
输出要求:
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(计数时包括初始位置时的瓷砖)。
输入样例:
6 9$$$$#$
$$$$$#
$$$$$$
$$$$$$
$$$$$$
$$$$$$
$$$$$$
#@$$$#
$#$$#$输出样例:
45
我的思路是使用DFS搜索来做,觉得代码的逻辑上是没有问题的,但是输出是0,想写一篇博文,帮助自己理清思路。
分析:获取其实位置('@'所在的位置),然后开始通过dfs不停的向自身所在位置的四周探索,同时用一个数组记录这个位置是否走过,如果没有的话结果+1.
#include<stdio.h> #include<string.h> #include<stdlib.h> char ch[100][100]; int line,row; //flag[]存储这一块可行的地砖是否走过 int flag[100][100]; int count=0; void dfs(int x, int y){ //边界检查 if(x<0||x>=line||y<0||y>=row) return; //不是$符号的不能进去 if(ch[x][y]!='$'||ch[x][y]!='@') return; int r1,r2; //如果这块没有走过,那么块数+1 if(!flag[x][y]){ count++; flag[x][y]=1; } //向四个方向搜索 dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); } int main(void){ scanf("%d%d",&row,&line); printf("line:%d,row:%d ",line,row); int r1=0,r2; while(getchar()!=' ') ; while(r1<line) gets(ch[r1++]); memset(flag,0,sizeof(flag)); int x=-1,y=-1; //找出初始地方的砖块 for(r1=0;r1<line;r1++){ for(r2=0;r2<row;r2++){ if(ch[r1][r2]=='@'){ x=r1; y=r2; break; } } if(x!=-1) break; } dfs(x,y); printf("%d",count); return 0; }
//2017-1-17更新
今天重新写了一遍,用最简单的dfs框写了出来,一开始写完后,卡在了判断初始地点(即'@'字符所在的位置),后面感觉是自己的读取方式有问题,从一次读取一行改成一次读取一个字符,就妥当了。
#include<stdio.h> #include<string.h> //黑可走,白不可走 #define BLACK '$' #define START '@' #define WHITE '#' //预设 int line,row; int Set[1000][1000]; int Flag[1000][1000]; int Count=0; void dfs(int x, int y){ //边界 if(x<0||x>=line||y<0||y>=row){ return; } //检查这一步能不能走 if(Set[x][y]!='#') if(!Flag[x][y]){ Count++; Flag[x][y]=1; } else return; if(Set[x][y]=='#') return; if(!Flag[x][y]){ Count++; Flag[x][y]=1; } //检查这一步是不是计过数了 dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); } int main(void){ memset(Flag,0,sizeof(Flag)); scanf("%d%d",&row,&line); while(getchar()!=' '); int r1,r2; for(r1=0;r1<line;r1++){ for(r2=0;r2<row;r2++) scanf("%c", &Set[r1][r2]); while(getchar()!=' '); } int found=0; //找到起始坐标 for(r1=0;r1<line;r1++){ for(r2=0;r2<row;r2++){ if(Set[r1][r2]=='@'){ found=1; break; } } if(found==1) break; } dfs(r1,r2); printf("%d",Count); return 0; }