首页 > 其他 > 详细

poj-1979改-红与黑

时间:2017-01-15 17:54:56      阅读:313      评论:0      收藏:0      [点我收藏+]

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-红与黑

 

poj-1979改-红与黑

原文:http://www.cnblogs.com/UncleXiang/p/6287461.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!