zoukankan      html  css  js  c++  java
  • Red and Black

    Problem Description
    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

    Write a program to count the number of black tiles which he can reach by repeating the moves described above.

    Input
    The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

    There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

    '.' - a black tile
    '#' - a red tile
    '@' - a man on a black tile(appears exactly once in a data set)

    Output
    For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

    Sample Input
    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......
    #@...#
    .#..#.
    11 9
    .#.........
    .#.#######.
    .#.#.....#.
    .#.#.###.#.
    .#.#..@#.#.
    .#.#####.#.
    .#.......#.
    .#########.
    ...........
    11 6
    ..#..#..#..
    ..#..#..#..
    ..#..#..###
    ..#..#..#@.
    ..#..#..#..
    ..#..#..#..
    7 7
    ..#.#..
    ..#.#..
    ###.###
    ...@...
    ###.###
    ..#.#..
    ..#.#..
    0 0

    Sample Output
    45
    59
    6
    13
    题意:有一间房子,有红黑瓷砖,人只能在黑的上面活动,人在的位置就是@符号在的位置,求人能活动的瓷砖个数,人每次只能向前后左右移动;
    解题思路:深搜,将走过的地板标记为1,具体过程看代码吧;
    感悟:庆祝第一个独立写完的深搜代码!!!哦也!!!!
    代码(G++ 0ms)
    #include
    #include
    #include
    #include
    #define maxn 100
    using namespace std;
    bool visit[maxn][maxn];
    char mapn[maxn][maxn];
    int direction[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    int w,h,s=1;
    void dfs(int w,int h,int sx,int sy)
    {
        int x,y;
        for(int i=0;i<4;i++)
        {
            //printf("i=%d ",i);
            x=sx+direction[i][0];
            y=sy+direction[i][1];//记录坐标
            if(x>=1&&x<=h&&y>=1&&y<=w&&visit[x][y]==false&&mapn[x][y]=='.')
            {
                visit[x][y]=true;
                s++;
                dfs(w,h,x,y);
            }
        }
    }
    int main()
    {
        //freopen("in.txt", "r", stdin);
        int x,y;
        while(~scanf("%d%d ",&w,&h)&&(w||h))
        {
            //printf("w=%d h=%d ",w,h);
            s=1;
            memset(visit,false,sizeof(visit));
            for(int i=1;i<=h;i++)
            {
                for(int j=1;j<=w;j++)
                {
                    scanf("%c",&mapn[i][j]);
                   // printf("mapn[i][j]=%c ",mapn[i][j]);
                    //printf("i=%d ",i);
                    if(mapn[i][j]=='@')
                    {
                        x=i;
                        y=j;
                        visit[x][y]=true;
                    }//记录@符出现的位置
                }
                scanf(" ");
            }
            //for(int i=1;i<=h;i++)
            //{
            //    for(int j=1;j<=w;j++)
            //    {
            //        printf("%c",mapn[i][j]);
            //    }
             //   printf(" ");
            //}
            //printf("mapn[x][y]=%c ",mapn[x][y]);
            dfs(w,h,x,y);//开始深搜
            printf("%d ",s);
        }
        return 0;
    }
  • 相关阅读:
    UVa 725 Division --- 简单枚举
    最短路之Floyd算法
    最短路之Bellman-Ford算法
    快速排序算法
    Dijkstra算法 --- 单源最短路
    HDU 2553 N皇后问题 --- 经典回溯
    HDU 2072 单词数
    HDU 1241 Oil Deposits --- 入门DFS
    jq val() 和 html() 用法注意
    jq 登录正则验证
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5781623.html
Copyright © 2011-2022 走看看