https://www.nowcoder.com/acm/contest/67/C
题目链接如上。
思路:纯粹的模拟,不过要注意只有两个打一个子才能吃掉,就是只有图片上的那八种情况。我的做法是上面的为part1,下面的为part2,然后对每一步寻找移动过后是否会发生打击,对于改行列找到part1和part2的棋子个数,只有两者为2和1的时候才会发生打击,然后再看这两个棋子是否是相连的,只有相连的才有可能发生打击,然后再找到第一个与其不想连的,如果是空的话,就是没有发生打击,如果是另一个part,就是发生了打击。
代码如下:
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int MAX = 10;
int Map[MAX][MAX];
void init(){//对棋盘进行初始化
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
Map[i][j] = 0;
Map[1][1] = 11;Map[1][2] = 10;Map[1][3] = 9;Map[1][4] = 8;
Map[2][1] = 12;Map[2][4] = 7;Map[3][1] = 1;Map[3][4] = 6;
Map[4][1] = 2;Map[4][2] = 3;Map[4][3] = 4;Map[4][4] = 5;
}
void Display(){//用于显示棋盘
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
cout << setw(3) << Map[i][j];
}
cout << endl;
}
}
int Get(int value){//得到这个value是属于哪一个part的
if(value == 0)
return 0;
if(7 <= value && value <= 12)
return 1;
else
return 2;
}
void hurt(int part,int x,int y){
int tx = 0,ty = y;
int Belong = 0,UnBelong = 0;//属于该part和不属于该part的。
//相对这一列进行寻找
while(++tx <= 4){
if(Get(Map[tx][ty]) == part)
Belong++;
else if(Get(Map[tx][ty] == 0))
continue;
else
UnBelong++;
}
//只有2,1才会发生打击
if(Belong == 2 && UnBelong == 1){
int Count = 1;//判断这2个是否相连
tx = x-1;
if(tx >= 1 && Get(Map[tx][ty]) == part)
Count++;
tx = x+1;
if(tx <= 4 && Get(Map[tx][ty]) == part)
Count++;
if(Count == 2){
//寻找到第一个不相连的,如果是另一个part的,就直接打击掉
tx = x;
while(--tx >= 1){
if(Get(Map[tx][ty]) == 0)
break;
else if(Get(Map[tx][ty]) != part){//发生打击
Map[tx][ty] = 0;
break;
}
else
continue;
}
tx = x;
while(++tx <= 4){
if(Get(Map[tx][ty]) == 0)
break;
else if(Get(Map[tx][ty]) != part){
Map[tx][ty] = 0;
break;
}
else
continue;
}
}
}
//下面是对行进行寻找。因为会有同时打击两个的情况。
tx = x;ty = 0;
Belong = 0,UnBelong = 0;
while(++ty <= 4){
if(Get(Map[tx][ty]) == part)
Belong++;
else if(Get(Map[tx][ty] == 0))
continue;
else
UnBelong++;
}
if(Belong == 2 && UnBelong == 1){
int Count = 1;
ty = y - 1;
if(ty >= 1 && Get(Map[tx][ty]) == part)
Count++;
ty = y+1;
if(ty <= 4 && Get(Map[tx][ty]) == part)
Count++;
if(Count == 2){
ty = y;
while(--ty >= 1){
if(Get(Map[tx][ty]) == 0)
break;
else if(Get(Map[tx][ty]) != part){
Map[tx][ty] = 0;
break;
}
else
continue;
}
ty = y;
while(++ty <= 4){
if(Get(Map[tx][ty]) == 0)
break;
else if(Get(Map[tx][ty]) != part){
Map[tx][ty] = 0;
break;
}
else
continue;
}
}
}
}
void move(int x,int p){//移动该棋子
//先寻找到该value的坐标
int px = 0,py = 0;
for(int i=1;i<=4;++i){
bool isok = false;
for(int j=1;j<=4;++j){
if(Map[i][j] == x){
px = i;py = j;
isok = true;
break;
}
}
if(isok) break;
}
//按其方向进行移动,移动到tx,ty。
int tx = px,ty =py;
if(p == 1)
tx -= 1;
else if(p == 2)
tx += 1;
else if(p == 3)
ty -= 1;
else
ty += 1;
Map[tx][ty] = Map[px][py];
Map[px][py] = 0;
int part = (7 <= x && x <= 12)? 1:2;
hurt(part,tx,ty);//进行打击判断。
}
int main(void){
int N,q,p;
int Case = 0;
while(cin >> N){
init();
for(int i=1;i<=N;++i){
cin >> q >> p;
move(q,p);
}
cout << "#Case " << ++Case << ":" << endl;
Display();
}
return 0;
}