题目在这里1172
最近写的都是水题啊。。。囧
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
struct Los
{
int x;
int y;
Los(int x, int y)
{
this->x = x;
this->y = y;
}
};
int n, m;
char map[1001][1001];
int judege(Los los)
{
if (los.x < 1 || los.x > n || los.y < 1 || los.y > m)
return 0;
if (map[los.x][los.y] == 'O')
return 1;
else if (map[los.x][los.y] == 'X')
return -1;
else
return 0;
}
int main()
{
int k, x, y;
int ans, num = 1;
int q_dir[8][2] = { { 0, -1 }, { -1, 0 }, { 1, -1 }, { -1, 1 }, { 1, 0 }, { 0, 1 }, { 1, 1 }, { -1, -1 } };
int k_dir[8][2] = { { 1, -2 }, { 2, -1 }, { 2, 1 }, { 1, 2 }, { -1, 2 }, { -2, 1 }, { -2, -1 }, { -1, -2 } };
vector<Los> queen, knight;
while (cin >> n >> m && n != 0 && m != 0)
{
ans = n * m;
memset(map, 'O', sizeof(map));
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> x >> y;
queen.push_back(Los(x, y));
map[x][y] = 'Q';
ans--;
}
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> x >> y;
knight.push_back(Los(x, y));
map[x][y] = 'K';
ans--;
}
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> x >> y;
map[x][y] = 'P';
ans--;
}
int tep_x, tep_y, tep;
for (int i = 0; i < 8; i++)
{
for (vector<Los>::iterator iter = queen.begin(); iter != queen.end(); iter++)
{
tep_x = iter->x;
tep_y = iter->y;
while (1)
{
tep_x = tep_x + q_dir[i][0];
tep_y = tep_y + q_dir[i][1];
tep = judege(Los(tep_x, tep_y));
if (tep == 0)
break;//位置无效
map[tep_x][tep_y] = 'X';
if (tep != -1)
ans--;//位置已经被访问
}
}
for (vector<Los>::iterator iter = knight.begin(); iter != knight.end(); iter++)
{
tep_x = iter->x + k_dir[i][0];
tep_y = iter->y + k_dir[i][1];
if (judege(Los(tep_x, tep_y)) == 1)
{
map[tep_x][tep_y] = 'X';
ans--;
}
}
}
cout << "Board " << num << " has " << ans << " safe squares." << endl;
queen.clear();
knight.clear();
num++;
}
//system("pause");
return 0;
}