zoukankan      html  css  js  c++  java
  • 寒假刷题之普通之红与黑

    Description - 题目描述

     
    有个铺满方形瓷砖的矩形房间,每块瓷砖的颜色非红即黑。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。 
    
    敲个程序统计一下这样可以走到几块红砖上。 
    

      

    Input - 输入
    多组测试用例。每组数组开头有两个正整数W和H;W与H分别表示 x- 与 y- 方向上瓷砖的数量。W和W均不超过20。 
    
    还有H行数据,每行包含W个字符。每个字符表示各色瓷砖如下。 
    
    '.' - 一块黑砖 
    '#' - 一块红砖 
    '@' - 一个黑砖上的人(一组数据一个人) 
    输入以一行两个零为结束。 
    

    Output - 输出

    对于每组测试用例,输出他从起始砖出发所能抵达的瓷砖数量(包括起始砖)。
    
    Sample Input - 输入样例
    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......
    #@...#
    .#..#.
    11 9
    .#.........
    .#.#######.
    .#.#.....#.
    .#.#.###.#.
    .#.#..@#.#.
    .#.#####.#.
    .#.......#.
    .#########.
    ...........
    11 6
    ..#..#..#..
    ..#..#..#..
    ..#..#..###
    ..#..#..#@.
    ..#..#..#..
    ..#..#..#..
    7 7
    ..#.#..
    ..#.#..
    ###.###
    ...@...
    ###.###
    ..#.#..
    ..#.#..
    0 0
    

      

    Sample Output - 输出样例

    45
    59
    6
    13
    



    分析:

      感觉这个系列的题目都是比较水一点的,不过对于搜索入门的话,还是会比较适合就是了,闲来无事就随便写了写题解。
      对于BFS和DFS,感觉BFS一般是用来求解最值问题,然后DFS只是确认某个问题的答案或者某个要求是否可以到达。
      这个题只是单纯的问能到达砖块的个数,所以采用的是DFS.
    
      将输入的地图进行遍历找到当前位置,然后设为起始点,设立一个方向数组,用来决定前进的方向,即上下左右,
      将经过的位置进行标记,然后遍历整个地图之后的结果就是答案。
    




    代码:
      

    #include <stdio.h>
    #include <string.h>
    
    int n, m, ans=0;
    char map[25][25];
    bool isVisited[25][25];
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    
    bool isIn(int x, int y){
        
        if(x<0 || x>=n || y<0 || y>=m || isVisited[x][y] == true || map[x][y] == '#')
            return false;
        return true;
    }
    
    void doIt(int x, int y){
        
        isVisited[x][y] = true;
        ans++;
    }
    
    void DFS(int x, int y){
        
        for(int i=0;i<4;i++)
            if(isIn(x+dir[i][0], y+dir[i][1])){
                doIt(x+dir[i][0], y+dir[i][1]);
                DFS(x+dir[i][0], y+dir[i][1]);
            }
    }
    
    int main(){
        
        while(scanf("%d%d ",&m, &n) == 2){
            if(n==0 && m==0)    break;
            int x, y;    
            for(int i=0; i<n; i++){
                scanf("%s",map[i]);
                for(int j=0; j<m; j++)
                    if(map[i][j] == '@'){
                        x=i;
                        y=j;
                    }
            }
            memset(isVisited,false,sizeof(isVisited));
            ans = 1;
            isVisited[x][y] = true;
            DFS(x,y);
            printf("%d
    ",ans); 
        }
        return 0;
    }
  • 相关阅读:
    strstr 函数的实现
    函数模板与模板函数
    内核态和用户态
    最短路径算法(跟新SPFA,Ford)
    P1042 乒乓球
    P2347 砝码称重
    P1087 FBI树
    P1540 机器翻译
    P1028 数的计算
    P1067 多项式输出
  • 原文地址:https://www.cnblogs.com/huaixiaohai2015/p/6306037.html
Copyright © 2011-2022 走看看