• 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;
    }
  • 相关阅读:
    css选择器解析规则
    swiper轮播图包含视频或图片
    css实现文字选中变色
    swiper鼠标滚轮事件
    C语言中,关于相除的问题
    输入测试字符型数据的组数,再输入字符型数据,排坑
    C语言中,字符型数字与常数型数字的加减实现
    C语言的指针用法:输入一堆字符,把非字母的删去。
    C语言中倒序输出你输入的数。
    C语言中,嵌套的if语句的一些经验...
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4740589.html
Copyright © 2020-2023  润新知