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.
![](https://i-blog.csdnimg.cn/blog_migrate/4a2c874b4419df0d0f4d99be80f373a2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2715af318f8d65513d8277214bc7cc1c.png)
#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\n",line,row);
int r1=0,r2;
while(getchar()!='\n') ;
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()!='\n');
int r1,r2;
for(r1=0;r1<line;r1++){
for(r2=0;r2<row;r2++) scanf("%c", &Set[r1][r2]);
while(getchar()!='\n');
}
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;
}