红与黑(其实是走地砖

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\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;
}
Poj-1979-红与黑

 

 

//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;
} 

 

posted on 2017-01-15 17:29  Uncle_X  阅读(213)  评论(0编辑  收藏  举报

导航