zoukankan      html  css  js  c++  java
  • Codeforces Gym 100650D Queens, Knights and Pawns 暴力

    原题链接:http://codeforces.com/gym/100650/attachments/download/3269/20052006-acmicpc-east-central-north-america-regional-contest-ecna-2005-en.pdf

    题意

    给你个棋盘,棋盘上有若干皇后、骑士和士兵,皇后和骑士会攻击,士兵不会,攻击规则满足国际象棋的规则,问你有多少格子是安全的。

    题解

    直接模拟就好了

    代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define MAX_N 1003
    using namespace std;
    
    int n,m;
    int B[MAX_N][MAX_N];//0 empty 1 queen 2 knight 3 pawn -1 unsafe
    
    int qu[MAX_N][2],t0;
    int kn[MAX_N][2],t1;
    
    int qdx[8]={0,1,0,-1,1,1,-1,-1},qdy[8]={1,0,-1,0,1,-1,1,-1};
    int kdx[8]={2,1,-2,-1,2,1,-2,-1},kdy[8]={-1,-2,1,2,1,2,-1,-2};
    
    void display(){
        for(int i=0;i<n;i++,cout<<endl)
            for(int j=0;j<m;j++){
                switch (B[i][j]){
                    case 0:
                        cout<<'O';
                        break;
                    case 1:
                        cout<<'Q';
                        break;
                    case 2:
                        cout<<'K';
                        break;
                    case 3:
                        cout<<'P';
                        break;
                    case -1:
                        cout<<'#';
                        break;
                }
            }
    }
    
    int main() {
        int cas = 0;
        while (true) {
            scanf("%d%d", &n, &m);
            if (n == 0 && m == 0)break;
            memset(B, 0, sizeof(B));
            scanf("%d", &t0);
            for (int i = 0; i < t0; i++) {
                scanf("%d%d", &qu[i][0], &qu[i][1]);
                qu[i][0]--;qu[i][1]--;
                B[qu[i][0]][qu[i][1]] = 1;
            }
            scanf("%d", &t1);
            for (int i = 0; i < t1; i++) {
                scanf("%d%d", &kn[i][0], &kn[i][1]);
                kn[i][0]--;kn[i][1]--;
                B[kn[i][0]][kn[i][1]] = 2;
            }
            int tp;
            scanf("%d", &tp);
            for (int i = 0; i < tp; i++) {
                int u, v;
                scanf("%d%d", &u, &v);
                u--;v--;
                B[u][v] = 3;
            }
    
            for (int i = 0; i < t0; i++) {
                int u = qu[i][0], v = qu[i][1];
                for (int j = 0; j < 8; j++)
                    for (int k = 1; ; k++) {
                        int nx = u + k * qdx[j], ny = v + k * qdy[j];
                        if (nx >= n || nx < 0 || ny >= m || ny < 0 || B[nx][ny] > 0)break;
                        B[nx][ny] = -1;
                    }
            }
            for (int i = 0; i < t1; i++) {
                int u = kn[i][0], v = kn[i][1];
                for (int j = 0; j < 8; j++) {
                    int nx = u + kdx[j], ny = v + kdy[j];
                    if (nx < 0 || nx >= n || ny < 0 || ny >= m || B[nx][ny] != 0)continue;
                    B[nx][ny] = -1;
                }
            }
            //display();
            int s = 0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    if (B[i][j] == 0)s++;
            printf("Board %d has %d safe squares.
    ", ++cas, s);
        }
        return 0;
    }
  • 相关阅读:
    bzoj4555
    bzoj4516
    树莓派/Debian 挂载硬盘
    树莓派/Debian Apache2 安装腾讯云 SSL 证书
    2019-2020-2《网络对抗技术》 Exp2 后门原理与实践
    kali 开启 SSH 服务
    Docker 入门 7 构建镜像
    Docker 入门 6 获取、加速镜像.md
    Docker 入门 5 数据管理
    Docker 入门 4 容器端口映射 和 Nginx 演示部署
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4740589.html
Copyright © 2011-2022 走看看