East Central North America 2005——Queens, Knights and Pawns
题目来源:
题意:
有一个 (n imes m) 的棋盘,放置了国际象棋的骑士,士兵,皇后。每颗棋子只能走一步,士兵不能行动并作为其它棋子的障碍,问棋盘上有几个位置是安全的(不会被上述3种棋子走到)。
题目分析:
暴力模拟,注意只能走一步。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn=1111;
char ma[maxn][maxn];
int n,m;
int k,x,y;
int ans;
int cas;
pair<int,int> move_k[8]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
pair<int,int> move_q[8]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
vector<pair<int,int> > Q;
int main()
{
#ifndef ONLINE_JUDGE
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#endif
cas=0;
while(~scanf("%d%d",&n,&m) && n+m)
{
cas++;
ans = 0;
memset(ma,0,sizeof(ma));
Q.clear();
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
ma[x][y]='Q';
Q.push_back(make_pair(x,y));
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
ma[x][y]='K';
for(int i=0;i<8;i++)
{
int xx = x+move_k[i].first,yy=y+move_k[i].second;
if(xx >=1&&xx<=n&&yy>=1&&y<=m)
{
if(ma[xx][yy]==0)
ma[xx][yy]='B';
}
}
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
ma[x][y]='P';
}
for(int i=0;i<Q.size();i++)
{
int xp=Q[i].first,yp=Q[i].second;
for(int j=0;j<8;j++)
{
int xx=xp,yy=yp;
while(xx >=1&&xx<=n&&yy>=1&&yy<=m)
{
xx+=move_q[j].first;
yy+=move_q[j].second;
if(ma[xx][yy]=='P' || ma[xx][yy]=='K')
break;
if(ma[xx][yy] == 0)
ma[xx][yy]='B';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans += ma[i][j]==0?1:0;
}
}
printf("Board %d has %d safe squares.
",cas,ans);
}
return 0;
}