/*1172. Queens, Knights and Pawns(计算安全的格子)
大意:给出三种Queens、Knights、和Pawns。Queen每次走一格,可走八个方向
但是会被任何一种东西阻挡,被阻挡后就马上停止了,而且每次都是朝着
同一个方向移动的。Knights则是走日字的,但不会被东西阻挡,且只走一步
思路:初始化一个visit数组,初始被占据的为2,其余空的为0,被访问过的为1
*/
#include <iostream>
#include <stdlib.h>
#include <memory.h>
using namespace std;
struct Point
{
int row;
int col;
};
int n, m;
int takePosition;
int unSafeNum;
int testNum = 0;
int** visit = new int*[1001];
Point quene[100], knight[100], pawn[100];
int queneNum, knigthNum, pawnNum;
int knightDirection[8][2] = {{-1,2}, {-2,1}, {-2,-1}, {-1,-2},{1,-2},{2,-1},{2,1},{1,2}};
int queneDircetion[8][2] = {{-1,1}, {-1,0}, {-1,-1}, {0,-1}, {1,-1},{1,0}, {1,1},{0,1}};
bool isOutBound(int row, int col){
if(row<1 || row> n || col <1 || col > m)
return true;
return false;
}
void computeKnightMov(){
for(int i=0; i<knigthNum; i++){
for(int k=0; k<8; k++){
int movRow = knight[i].row + knightDirection[k][0];
int movCol = knight[i].col + knightDirection[k][1];
if(!isOutBound(movRow, movCol) && visit[movRow][movCol] == 0){
visit[movRow][movCol] = 1;
unSafeNum++;
}
}
}
}
void computeQueneMov(){
for(int i=0; i<queneNum; i++){
for(int k=0; k<8; k++){
int movRow = quene[i].row + queneDircetion[k][0];
int movCol = quene[i].col + queneDircetion[k][1];
while(!isOutBound(movRow, movCol)) {
if( visit[movRow][movCol] == 2)
break;
if(visit[movRow][movCol] == 0){
visit[movRow][movCol] = 1;
unSafeNum++;
}
movRow += queneDircetion[k][0];
movCol += queneDircetion[k][1];
}
}
}
}
void computeOccupied(){
computeKnightMov();
computeQueneMov();
}
int main()
{
for(int i = 0; i < 1001; i++)
visit[i] = new int[1001];
while(cin >> n >> m && n!=0 && m!=0){
for(int i = 0; i < 1001; i++)
memset(visit[i], 0, sizeof(visit[i])*1001);
//cout << visit[2][3] << endl;
cin >> queneNum;
int row,col;
takePosition = 0;
unSafeNum = 0;
for(int i=0; i<queneNum; i++) {
cin >> row >> col;
quene[i].row = row;
quene[i].col = col;
visit[row][col] = 2;
takePosition++;
}
cin >> knigthNum;
for(int i=0; i<knigthNum; i++) {
cin >> row >> col;
knight[i].row = row;
knight[i].col = col;
visit[row][col] = 2;
takePosition++;
}
cin >> pawnNum;
for(int i=0; i<pawnNum; i++) {
cin >> row >> col;
pawn[i].row = row;
pawn[i].col = col;
visit[row][col] = 2;
takePosition++;
}
computeOccupied();
testNum++;
cout << "Board " << testNum << " has " << n*m - takePosition - unSafeNum << " safe squares."<< endl;
}
for(int i = 0; i < 1001; i++)
delete []visit[i];
delete []visit;
//system("pause");
return 0;
}
Sicily.1172. Queens, Knights and Pawns(计算安全的格子)
最新推荐文章于 2019-04-23 14:51:49 发布