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;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号