没什么好说的,把代码写简洁一些。
#include <iostream>
#include <vector>
using namespace std;
enum Status {OCCUPIED, UNSAFE, SAFE};
typedef pair<int, int> Loc;
Loc queensForward(Loc& loc, int type) {
switch (type) {
case 0:
--loc.first;
return loc;
case 1:
++loc.first;
return loc;
case 2:
--loc.second;
return loc;
case 3:
++loc.second;
return loc;
case 4:
--loc.first;
--loc.second;
return loc;
case 5:
++loc.first;
--loc.second;
return loc;
case 6:
--loc.first;
++loc.second;
return loc;
case 7:
++loc.first;
++loc.second;
return loc;
default:
return loc;
}
}
void queensKill(Loc origin, vector<vector<int> > &board) {
for (int i=0; i<8; i++) {
Loc loc=origin;
while ( queensForward(loc, i), (loc.first>0)&&(loc.first<board.size())
&&(loc.second>0)&&(loc.second<board[0].size()))
if (board[loc.first][loc.second]==OCCUPIED)
break;
else
board[loc.first][loc.second]=UNSAFE;
}
}
void kightsKill(Loc origin, vector<vector<int> > &board) {
int r, c;
static const Loc moves[8]={make_pair(-2,1), make_pair(-1,2), make_pair(1,2),
make_pair(2,1), make_pair(2,-1), make_pair(1,-2),
make_pair(-1, -2), make_pair(-2, -1)};
for (int i=0; i<8; i++)
if (((r=origin.first+moves[i].first)>0)&&(r<board.size())
&&((c=origin.second+moves[i].second)>0)&&(c<board[0].size()))
if (board[r][c]!=OCCUPIED)
board[r][c]=UNSAFE;
}
int main() {
int counter=0;
int row, col;
while(cin>>row>>col, (row!=0)&&(col!=0)) {
vector<vector<int> > board(row+1, vector<int>(col+1, SAFE));
// Ignore Row 0 and Column 0
int s;
cin>>s;
vector<Loc> queens(s);
for (int i=0; i<s; i++) {
cin>>queens[i].first>>queens[i].second;
board[queens[i].first][queens[i].second]=OCCUPIED;
}
cin>>s;
vector<Loc> kights(s);
for (int i=0; i<s; i++) {
cin>>kights[i].first>>kights[i].second;
board[kights[i].first][kights[i].second]=OCCUPIED;
}
cin>>s;
vector<Loc> pawns(s);
for (int i=0; i<s; i++) {
cin>>pawns[i].first>>pawns[i].second;
board[pawns[i].first][pawns[i].second]=OCCUPIED;
}
for (int i=0; i<queens.size(); i++)
queensKill(queens[i], board);
for (int i=0; i<kights.size(); i++)
kightsKill(kights[i], board);
int ans=0;
for (int i=1; i<=row; i++)
for (int j=1; j<=col; j++)
if (board[i][j]==SAFE)
++ans;
cout<<"Board "<<++counter<<" has "<<ans<<" safe squares.\n";
}
return 0;
}
// by wbchou
// Feb 21th, 2013