记录
代码
#include<bits/stdc++.h>
#define RD read()
using namespace std;
int read(){
int x = 0, f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 3) + (x << 1) + ch - '0';ch = getchar();}
return x * f;
}
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[8] = {0, -1, -1, -1, 0, 1, 1, 1};
int ice_num[16][16];
bool ice_TF[16][16][25];
int ice_has;
int n, Hm, Hr, Hc, Hx, Hy, m;
string ins;
void ICE_BARRAGE(int x, int y, int d, int s){
int k = 0;
for(int i = 0;i <= s;++ i){
int xx = x + i * dx[d], yy = y + i * dy[d];
if(xx < 0 || xx > n - 1 || yy < 0 || yy > n - 1) break;
if(ice_TF[xx][yy][0]) break;
if(ice_num[xx][yy] != 4) ++ k, ++ ice_num[xx][yy];
}
printf("CIRNO FREEZED %d BLOCK(S)\n", k);
return;
}
void MAKE_ICE_BLOCK(){
int k = 0;
// puts("pass");
for(int i = 0;i < n;++ i){
for(int j = 0;j < n;++ j){
if(ice_num[i][j] == 4){
++ k;
ice_num[i][j] = 0;
}
}
}
ice_has += k;
printf("CIRNO MADE %d ICE BLOCK(S),NOW SHE HAS %d ICE BLOCK(S)\n", k ,ice_has);
return;
}
bool crossed(int r, int c, int h){if(r < 0 || r > n - 1 || c < 0 || c > n - 1 || h < 0 || h > Hm - 1)return 1;return 0;}
bool near(int r, int c, int h){if(h == 0 || !crossed(r, c, h) && (ice_TF[r - 1][c][h] || ice_TF[r + 1][c][h] || ice_TF[r][c + 1][h] || ice_TF[r][c - 1][h] || ice_TF[r][c][h + 1] || ice_TF[r][c][h - 1]))return 1;return 0;}
void PUT_ICE_BLOCK(int r, int c, int h){
if(ice_has == 0){printf("CIRNO HAS NO ICE_BLOCK\n");return;}
if(ice_TF[r][c][h] || !(near(r, c, h))){printf("BAKA CIRNO,CAN'T PUT HERE\n");return;}
ice_TF[r][c][h] = 1;
if(h == 0) ice_num[r][c] = 0;
-- ice_has;
if(r < Hr || r > Hr + Hx - 1 || c < Hc || c > Hc + Hy - 1){printf("CIRNO MISSED THE PLACE\n");return;}
if(Hr + 1 <= r && r <= Hr + Hx - 2 && Hc + 1 <= c && c <= Hc + Hy - 2){printf("CIRNO PUT AN ICE_BLOCK INSIDE THE HOUSE\n");return;}
printf("CIRNO SUCCESSFULLY PUT AN ICE_BLOCK,NOW SHE HAS %d ICE_BLOCK(S)\n", ice_has);
}
struct rch{
int r, c, h;
};
bool vis[16][16][25];
int Dr[6]={1, -1, 0, 0, 0, 0}, Dc[6]={0, 0, 1, -1, 0, 0}, Dh[6]={0, 0, 0, 0, 1, -1};
int BFS(int r, int c, int h){
if(!crossed(r, c, h) || !ice_TF[r][c][h]) return 0;
queue<rch> Q;
Q.push(rch{r, c, h});
memset(vis, 0, sizeof vis);
int k = 0;
while(!Q.empty()){
rch now = Q.front();Q.pop();
if(now.h == 0) return 0;
if(vis[now.r][now.c][now.h]) continue;
vis[now.r][now.c][now.h] = 1;++ k;
int r = now.r, c = now.c, h = now.h;
for(int i = 0;i < 6;++ i){
int x = r + Dr[i], y = c + Dc[i], z = h + Dh[i];
if(!crossed(r, c, h) || !ice_TF[x][y][z]) continue;
Q.push(rch{x, y, z});
}
}
for(int i = 0;i < n;++ i)
for(int j = 0;j < n;++ j)
for(int q = 0;q < Hm;++ q)
if(vis[i][j][q]) ice_TF[i][j][q] = 0;
return k;
}
void REMOVE_ICE_BLOCK(int r, int c, int h){
if(!ice_TF[r][c][h]){printf("BAKA CIRNO,THERE IS NO ICE_BLOCK\n");return;}
int k = 0;
ice_TF[r][c][h] = 0;
ice_has ++;
k += BFS(r + 1, c, h);
k += BFS(r - 1, c, h);
k += BFS(r, c + 1, h);
k += BFS(r, c - 1, h);
k += BFS(r, c, h + 1);
k += BFS(r, c, h - 1);
if(k) printf("CIRNO REMOVED AN ICE_BLOCK,AND %d BLOCK(S) ARE BROKEN\n", k);
else printf("CIRNO REMOVED AN ICE_BLOCK\n");
return;
}
int main(){
n = RD;Hm = RD;Hr = RD;Hc = RD;Hx = RD;Hy = RD;m = RD;
int r, c, h, d, s;
while(m --){
cin >> ins;
if(ins == "ICE_BARRAGE"){
r = RD;c = RD;d = RD;s = RD;
ICE_BARRAGE(r, c, d, s);
}
if(ins == "MAKE_ICE_BLOCK") MAKE_ICE_BLOCK();
if(ins == "PUT_ICE_BLOCK"){
r = RD;c = RD;h = RD;
PUT_ICE_BLOCK(r, c, h);
}
if(ins == "REMOVE_ICE_BLOCK"){
r = RD;c = RD;h = RD;
REMOVE_ICE_BLOCK(r, c, h);
}
}
return 0;
}
两周了,请各位大佬看看