zoukankan      html  css  js  c++  java
  • poj 1979 Red and Black 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=1979

    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)
    The end of the input is indicated by a line consisting of two zeros.
    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

    大概意思就是 @是一个人的起点 可以在.的地板砖上移动 但是不能移动到#的地板上。求能够达到的最多地板
    算是基础的dfs题目 没有剪枝 就是遍历

    bfs图例

    代码

    #include <iostream>
    
    
    
    
    using namespace std;
    
    
    int n,m;
    
    const int N = 500;
    
    char graph[N][N];
    
    char visit[N][N];
    int ret = 0;
    
    int addx[] = { 1,-1,0,0 };
    int addy[] = { 0,0,1,-1 };
    
    
    void Dfs(int x, int y) {
        if (x < 0 || x >= n || y < 0 || y >= m) return;
    
        if (visit[x][y] == 1  || graph[x][y] == '#') return;
    
        visit[x][y] = 1;
        if (graph[x][y] == '.') {
            //cout << "x = " << x << ".   y = " << y << endl;
            ret++;
        }
    
        for (int i = 0; i < 4; i++) {
            int newx = x + addx[i];
            int newy = y + addy[i];
            Dfs(newx, newy);
        }
    
        return;
    }
    
    
    int main()
    {
        while (cin >> m >> n) {
            if (m == 0 || n == 0) break;
            int x, y; 
            ret = 0;
            memset(visit, 0, N*N);
    
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    cin >> graph[i][j];
                    if (graph[i][j] == '@') {
                        x = i; y = j;
                        ret++;
                    }
                }
            }
    
            Dfs(x, y);
    
            cout << ret << endl;
        }
        
        //system("pause");
    
        return 0;
    }
    
    
    // 111255.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    int n, m;
    
    const int N = 500;
    
    char graph[N][N];
    int vis[N][N];
    int ret = 0;
    
    int addx[] = { 1,-1,0,0 };
    int addy[] = { 0,0,1,-1 };
    
    
    int bfs(int x, int y)
    {
        queue<pair<int, int>> q;
        pair<int, int> pa = make_pair(x,y);
        q.push(pa);
        vis[x][y] = 1;
    
        while (!q.empty()) {
            pair<int, int> XY = q.front(); q.pop();
            ret++;
    
            for (int i = 0; i < 4; i++) {
                int newx = XY.first + addx[i];
                int newy = XY.second + addy[i];
    
                if (newx >= 0 && newx < m && newy >= 0 && newy < n &&
                    vis[newx][newy] == 0 && graph[newx][newy] != '#')
                {
                    pair<int, int> pa = make_pair(newx, newy);
                    q.push(pa);
                    vis[newx][newy] = 1;
                }
            }
        }
        return ret;
    }
    
    
    int main()
    {
        while (cin >> n >> m)
        {
            if (m == 0 || n == 0) break;
            memset(graph, 0, sizeof(graph));
            memset(vis, 0, sizeof(vis));
            ret = 0;
            int x = 0, y = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    cin >> graph[i][j];
                    if (graph[i][j] == '@') {
                        x = i; y = j;
                    }
                }
            }
    
            bfs(x, y);
    
            cout << ret << endl;
        }
    
        return 0;
    }
    bfs


    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    windows7下检测耳机麦克拔插(转)
    windows实时监测热插拔设备的变化(转)
    Windows ToolTips简要介绍(转)
    c /c++变参函数(转)
    SQL的四种连接查询(转)
    CRichEditCtrl 输入字符串长度限制
    MFC 将 '当前工作路径' 改为 'exe所在路径'(转)
    第5章 文本编程
    第4章 简单绘图
    VC++中有关句柄和指针及其转换(转)
  • 原文地址:https://www.cnblogs.com/itdef/p/11714427.html
Copyright © 2011-2022 走看看