P2105

K皇后

题目描述

小 Z 最近捡到了一个棋盘,他想在棋盘上摆放 \(K\) 个皇后。他想知道在他摆完这 \(K\) 个皇后之后,棋盘上还有多少个格子是不会被攻击到的。

注意:一个皇后会攻击到这个皇后所在的那一行,那一列,以及两条对角线。

输入格式

第一行三个正整数 \(n,m,K\),表示棋盘的行列,以及小 Z 摆放的皇后的个数。

接下来 \(K\) 行,每行两个正整数 \(x,y\),表示这个皇后被摆在了第 \(x\)行,第 \(y\) 列,数据保证任何两个皇后都不会被摆在同一个格子里。

输出格式

仅一个整数,表示棋盘上还有多少个格子是不会被攻击到的。

样例 #1

样例输入 #1

12 13 6
10 4
12 10
1 1
2 3
3 2
2 6

样例输出 #1

25
首先不能用数学方法直接算
其次暴力也要优化 (虽说这题正解的时间复杂度我都搞不懂)
先挂着吧
点击查看代码
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    return x*f;
}
inline void out(int x)
{
    if(x>=10){
        out(x/10);
    }
    putchar(x%10+'0');
}
int x[505],y[505];
int r[20005],q[20005];
int main()
{
//    ios::sync_with_stdio(false);
    int n,m,k;
    n=read(); m=read(); k=read();
    for(register int i=1;i<=k;i++)
    {
        x[i]=read(); y[i]=read();
        r[x[i]]=1;
    }
    int ans=0,sum;
    for(register int i=1;i<=n;i++)
    {
        if(r[i]==1) continue;
        memset(q,0,sizeof(q));
        sum=0;
        for(register int j=1;j<=k;j++)
        {
            q[y[j]]=1;
            if(x[j]<i)   //y[j] +/- (i-x[j])
            {
                if(y[j]+(i-x[j])<=m) q[y[j]+(i-x[j])]=1;
                if(y[j]-(i-x[j])>=1) q[y[j]-(i-x[j])]=1;
            }
            else   //y[j] +/- (x[j]-i)
            {
                if(y[j]+(x[j]-i)<=m) q[y[j]+(x[j]-i)]=1;
                if(y[j]-(x[j]-i)>=1) q[y[j]-(x[j]-i)]=1;
            }
        }
        for(register int j=1;j<=m;j++)
        {
            if(q[j]==0) sum++;
        }
        ans+=sum;
    }
    out(ans);
    return 0;
}
posted @ 2023-01-08 17:55  PKU_IMCOMING  阅读(10)  评论(0)    收藏  举报