P2105 K皇后

# K皇后

## 题目描述

小 Z 最近捡到了一个 $n$ 行 $m$ 列的棋盘,棋盘上的格子的横纵坐标从 $1$ 开始编号,他想在棋盘上摆放 $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
```

## 提示

- 对于 $30\%$ 的数据,$1\le n,m\le 5\times10^3$,$1\le K\le 500$;
- 对于另外 $10\%$ 的数据,$K=1$;
- 对于 $100\%$ 的数据,$1\le n,m\le 2\times 10^4$,$1\le K\le 500$。

#include

using namespace std;

int x[600],y[600];
int a,b,c;
int flag[20010],q[20010],m,n;
int main()
{
	cin>>a>>b>>c;
	for(int i=1;i<=c;i++) 
		cin>>x[i]>>y[i],q[x[i]]=1;
	for(int i=1;i<=a;i++)
	{
		if(q[i]) 
			continue;
		m=b;
		for(int j=1;j<=c;j++)
		{
			if(flag[y[j]]!=i) m-=1;
			flag[y[j]]=i;
			if(x[j]=1&&y[j]+i-x[j]<=b) 
				{
					if(flag[y[j]+i-x[j]]!=i) m-=1;
					flag[y[j]+i-x[j]]=i;
				}
				if(y[j]-i+x[j]>=1&&y[j]-i+x[j]<=b) 
				{
					if(flag[y[j]-i+x[j]]!=i) m-=1;
					flag[y[j]-i+x[j]]=i;
				}
			}
			else 
			{
				if(y[j]+(x[j]-i)>=1&&y[j]+(x[j]-i)<=b)
				{
					if(flag[y[j]+(x[j]-i)]!=i) m-=1;
					flag[y[j]+(x[j]-i)]=i;
				}
				if(y[j]-(x[j]-i)>=1&&y[j]-(x[j]-i)<=b)
				{
					if(flag[y[j]-(x[j]-i)]!=i) m-=1;
					flag[y[j]-(x[j]-i)]=i;
				}
			}
		}
		n+=m;
	}
	cout<

你可能感兴趣的:(算法)