求助,30pts
查看原帖
求助,30pts
718392
zhanglile楼主2024/5/23 22:36

记录
代码

#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;
}

两周了,请各位大佬看看

2024/5/23 22:36
加载中...