1. 程式人生 > >洛谷 P2105 K皇後

洛谷 P2105 K皇後

span nbsp article sca tdi sticky += 說明 break

P2105 K皇後

題目描述

小Z最近撿到了一個棋盤,他想在棋盤上擺放K個皇後。他想知道在他擺完這K個皇後之後,棋盤上還有多少了格子是不會被攻擊到的。

(Ps:一個皇後會攻擊到這個皇後所在的那一行,那一列,以及兩條對角線)

輸入輸出格式

輸入格式:

第一行三個正整數 n,m,K,表示棋盤的行列,以及小Z擺放了K個皇後。

接下來K行,每行兩個正整數x,y,表示這個皇後被擺在了第x行,第y列,數據保證沒有任何兩個皇後會被擺在同一個格子裏。

輸出格式:

一行一個整數,表示棋盤上還有多少了格子是不會被攻擊到的。

輸入輸出樣例

輸入樣例#1: 復制
12 13 6
10 4
12 10
1 1
2 3
3 2
2 6
輸出樣例#1: 復制
25

說明

【數據規模和約定】

對於 30%的數據,1 ≤ n,m ≤ 5000,1 ≤ k ≤ 500。

對於另外 10%的數據,k =1。

對於 100%的數據,1 ≤ n,m ≤ 20000,1 ≤ k ≤ 500。

【時空限制】

1s/32M

#include<cstdio>
#include<cstring>
#include<iostream>
#include
<algorithm> using namespace std; int n,m,k,ans,t; int x[501],y[501],h[20001]; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++) scanf("%d%d",&x[i],&y[i]); ans=0; for(int i=1;i<=n;i++){ t=m; for(int j=1;j<=k;j++)
if(x[j]==i){ t=0;break; } else{ if(h[y[j]]!=i){ h[y[j]]=i;t--; } if((i+y[j]-x[j])>0&&(i+y[j]-x[j])<=m&&h[i+y[j]-x[j]]!=i){ h[i+y[j]-x[j]]=i;t--; } if((y[j]+x[j]-i)>0&&(y[j]+x[j]-i)<=m&&h[y[j]+x[j]-i]!=i){ h[y[j]+x[j]-i]=i;t--; } } ans+=t; } printf("%d",ans); }

洛谷 P2105 K皇後