zoukankan      html  css  js  c++  java
  • 红与黑(其实是走地砖

    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;
    }
    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()!='
    ');
        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;
    } 
  • 相关阅读:
    HDU 1505 & POJ 1964 City Game (递推+扫描法)
    web页面内容优化管理与性能技巧
    POJ2406简单KMP
    poj2418map或者字典树
    poj2418map或者字典树
    POJ2296二分2sat
    POJ2296二分2sat
    poj2186强联通(牛仰慕)
    poj2186强联通(牛仰慕)
    poj2175费用流消圈算法
  • 原文地址:https://www.cnblogs.com/UncleXiang/p/6287461.html
Copyright © 2011-2022 走看看