• [acm 1002] 浙大 Fire Net


    已转战浙大

    题目 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2

    浙大acm 1002

    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    
    #include <list>
    
    #define OPEN 1
    #define CASTLE 2
    #define BLOCK 3
    #define WALL 4
    
    // summary: 用贪心原理找到一个影响地图最小的城堡的位置
    // param in: map[] 输入的地图. n 地图大小.
    // param out: min_x,min_y  得出的放置的城堡的x,y坐标
    // return: true 找到了合适的位置. false 没有可以放置城堡的地方了
    #define MAX_POINT 10000 // 哨兵数
    bool FindMinInfluencePosition(int map[][4], int n, int &min_x, int &min_y)
    {
        int min_point = MAX_POINT; // 赋哨兵值
        min_x = min_y = 0;
    
        for (int y = 0; y < n; y++)
        {
            for (int x = 0; x < n; x++)
            {
                if ( map[y][x] == OPEN)
                {
                    int curr_point = 1;
    
                    // 向上
                    for (int j = y - 1; j >= 0 && map[j][x] != WALL; j--)
                    {
                        if ( map[j][x] == OPEN)
                            curr_point++;
                    }
    
                    // 向下
                    for (int j = y + 1; j < n && map[j][x] != WALL; j++)
                    {
                        if ( map[j][x] == OPEN)
                            curr_point++;
                    }
    
                    // 向左
                    for (int j = x - 1; j >= 0 && map[y][j] != WALL; j--)
                    {
                        if ( map[y][j] == OPEN)
                            curr_point++;
                    }
    
                    // 向右
                    for (int j = x + 1; j < n && map[y][j] != WALL; j++)
                    {
                        if ( map[y][j] == OPEN)
                            curr_point++;
                    }
    
                    if (curr_point < min_point)
                    {
                        min_point = curr_point;
                        min_x = x;
                        min_y = y;
                    }
                }
            }
        }
    
        // 检测是否放置了城堡
        if (min_point != MAX_POINT)
            return true;
        else
            return false;
    
    }
    
    // summary: 根据位置放置城堡,在地图上标记出来
    // param in: map[] 输入的地图. n 地图大小. x, y 放置的城堡的位置
    void PlaceCastle(int map[][4], int n, int x, int y)
    {
        map[y][x] = CASTLE;
    
        // 向上
        for (int j = y - 1; j >= 0 && map[j][x] != WALL; j--)
        {
            map[j][x] = BLOCK;
        }
    
        // 向下
        for (int j = y + 1; j < n && map[j][x] != WALL; j++)
        {
            map[j][x] = BLOCK;
        }
    
        // 向左
        for (int j = x - 1; j >= 0 && map[y][j] != WALL; j--)
        {
            map[y][j] = BLOCK;
        }
    
        // 向右
        for (int j = x + 1; j < n && map[y][j] != WALL; j++)
        {
            map[y][j] = BLOCK;
        }
    }
    
    
    int main ()
    {
        int map[4][4];
        std::list<int> answer;
        int n;
        char c;
    
        // 读取数据
        std::cin>>n;
        while (n != 0)
        {
            // 读取地图数据
            for (int y = 0; y < n; y++)
            {
                for (int x = 0; x < n; x++)
                {
                    std::cin>>c;
                    if (c == '.')
                        map[y][x] = OPEN;
                    else
                        map[y][x] = WALL;
                }
            }
    
            // 处理地图
            int castle_number = 0;
            int min_x, min_y;
            while (FindMinInfluencePosition(map, n, min_x, min_y) == true )
            {
                castle_number++;
                PlaceCastle(map, n, min_x, min_y);
            }
    
            // 记录数据
            answer.push_back(castle_number);
    
            // 输入下一个数
            std::cin>>n;
        }
    
        // 输出数目
        for (std::list<int>::iterator it=answer.begin() ; it != answer.end(); ++it)
            std::cout <<*it<<"
    ";
    
        return 0;
    }
  • 相关阅读:
    【模式识别与机器学习】——4.3离散K-L变换
    【模式识别与机器学习】——4.2特征选择
    【模式识别与机器学习】——4.1模式分类可分性的测度
    【模式识别与机器学习】——3.10决策树
    【模式识别与机器学习】——3.9势函数法:一种确定性的非线性分类方法
    【模式识别与机器学习】——3.8可训练的确定性分类器的迭代算法
    Android Appliction 使用解析
    Android Service 生命周期
    Android View 绘制刷新流程分析
    Android 设置Activity样式 透明度
  • 原文地址:https://www.cnblogs.com/night-ride-depart/p/4464380.html
Copyright © 2020-2023  润新知