求助模拟题!码了一天了,快哭了
查看原帖
求助模拟题!码了一天了,快哭了
414386
Isshiki·Iroha楼主2021/10/6 21:09

其他都对,MAKE_ROOFPerfect 都判不了,求助!

/*
	Name: 琪露诺的冰雪小屋
	Copyright: LG P3693
	Author: Isshiki Iroha
	Date: 06/10/21 15:44
	Description: 大模拟
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=20;
const int ice_house=-1;
int n,Hm,Hr,Hc,Hx,Hy,m;
int ice[maxn][maxn];
int sky_ice[maxn][maxn][maxn];
bool High_not_const=true;
int has_ice;


string s;

inline void Print_ice() {
	for(int i(0); i<n; ++i) {
		for(int j(0); j<n; ++j) {
			cout<<ice[i][j]<<" ";
		}
		cout<<endl;
	}
}


int ICE_BARRAGE_X[8]= {-1,-1,0,1,1,1,0,-1};
int ICE_BARRAGE_Y[8]= {0,-1,-1,-1,0,1,1,1};
inline void ICE_BARRAGE(int R,int C,int D,int S) {
	int vector_x=ICE_BARRAGE_X[D];
	int vector_y=ICE_BARRAGE_Y[D];
	int Ice_successed=0;
	for(int i(0),Ice_attck_x=R,Ice_attck_y=C; i<=S; ++i) {
		if(Ice_attck_x<0||Ice_attck_y<0||Ice_attck_x>=n||Ice_attck_y>=n)break;
		if(sky_ice[Ice_attck_x][Ice_attck_y][0])break;
		if(ice[Ice_attck_x][Ice_attck_y]==4)goto DONT_ATTCK;
		++Ice_successed;
		++ice[Ice_attck_x][Ice_attck_y];
DONT_ATTCK:
		;
		Ice_attck_x+=vector_x;
		Ice_attck_y+=vector_y;
	}
	printf("CIRNO FREEZED %d BLOCK(S)\n",Ice_successed);
}


inline void MAKE_ICE_BLOCK() {
	int now_ice_made=0;
	for(int i(0); i<n; ++i) {
		for(int j(0); j<n; ++j) {
			if(ice[i][j]>=4&&!sky_ice[i][j][0]) {
				ice[i][j]-=4;
				++now_ice_made;
			}
		}
	}
	has_ice+=now_ice_made;
	printf("CIRNO MADE %d ICE BLOCK(S),NOW SHE HAS %d ICE BLOCK(S)\n",now_ice_made,has_ice);
}

const int dx[4]= {0,0,1,-1};
const int dy[4]= {1,-1,0,0};
inline void PUT_ICE_BLOCK(int R,int C,int H) {
	if(has_ice==0) {
		printf("CIRNO HAS NO ICE_BLOCK\n");
		return;
	}
	for(int i(0),Tx,Ty,Tz; i<4; ++i) {
		if(sky_ice[R][C][H])break;
		Tx=R+dx[i];
		Ty=C+dy[i];
		if(Tx<0||Ty<0||Tx>=n||Ty>=n)continue;
		if(sky_ice[Tx][Ty][H]||H==0||sky_ice[R][C][H-1])goto CANPUSH;
	}
	printf("BAKA CIRNO,CAN'T PUT HERE\n");
	return;
CANPUSH:
	;

	--has_ice;
	if(R<Hr||R>Hr+Hx-1||C<Hc||C>Hc+Hy-1) {
		printf("CIRNO MISSED THE PLACE\n");
	} else if(Hr+1<=R&&R<=Hr+Hx-2&&Hc+1<=C&&C<=Hc+Hy-2&&High_not_const) {
		printf("CIRNO PUT AN ICE_BLOCK INSIDE THE HOUSE\n");
	} else {
		printf("CIRNO SUCCESSFULLY PUT AN ICE_BLOCK,NOW SHE HAS %d ICE_BLOCK(S)\n",has_ice);
	}
	++sky_ice[R][C][H];
	if(H==0)ice[R][C]=0;
}


const int Dx[6]= {0,0,0,0,1,-1};
const int Dy[6]= {0,0,1,-1,0,0};
const int Dz[6]= {1,-1,0,0,0,0};
int vis[maxn][maxn][maxn];
typedef pair<int,int> PII;
typedef pair< PII ,int > PIII;
inline int BFS_REMOVE_ICE_BLOCK(int R,int C,int H) {
	queue<PIII>q;
	if(!sky_ice[R][C][H])return 0;
	int fallen_ice_block=1;

	bool touch_to_floor=false;

	memset(vis,0,sizeof vis);
	vis[R][C][H]=1;
	q.push(make_pair(make_pair(R,C),H));
	while(!q.empty()&&!touch_to_floor) {
		PIII T=q.front();
		q.pop();
		int X=T.first.first;
		int Y=T.first.second;
		int Z=T.second;
		if(Z==0) {
			touch_to_floor=true;
			break;
		}
		for(int i(0),Tx,Ty,Tz; i<6; ++i) {
			Tx=X+Dx[i];
			Ty=Y+Dy[i];
			Tz=Z+Dz[i];
			if(Tx<0||Ty<0||Tx>=n||Ty>=n||Tz>Hm||vis[Tx][Ty][Tz]||sky_ice[Tx][Ty][Tz])continue;
			vis[Tx][Ty][Tz]=1;
			q.push(make_pair(make_pair(Tx,Ty),Tz));
		}
	}

	if(touch_to_floor==true)return 0;

	while(!q.empty())q.pop();
	sky_ice[R][C][H]=0;

	q.push(make_pair(make_pair(R,C),H));
	while(!q.empty()) {
		PIII T=q.front();
		q.pop();
		int X=T.first.first;
		int Y=T.first.second;
		int Z=T.second;
		for(int i(0),Tx,Ty,Tz; i<6; ++i) {
			Tx=X+Dx[i];
			Ty=Y+Dy[i];
			Tz=Z+Dz[i];
			if(Tx<0||Ty<0||Tx>=n||Ty>=n||Tz>Hm||!sky_ice[Tx][Ty][Tz])continue;
			sky_ice[Tx][Ty][Tz]=0;
			++fallen_ice_block;
			q.push(make_pair(make_pair(Tx,Ty),Tz));
		}
	}
	return fallen_ice_block;
}
inline void REMOVE_ICE_BLOCK(int R,int C,int H) {
	if(sky_ice[R][C][H]==0) {
		printf("BAKA CIRNO,THERE IS NO ICE_BLOCK\n");
		return;
	}
	sky_ice[R][C][H]=0;
	int fallen_ice_block=0;
	for(int i(0),Tx,Ty,Tz; i<6; ++i) {
		Tx=R+Dx[i];
		Ty=C+Dy[i];
		Tz=H+Dz[i];
		if(Tx<0||Ty<0||Tx>=n||Ty>=n)continue;
		fallen_ice_block+=BFS_REMOVE_ICE_BLOCK(Tx,Ty,Tz);
	}
	++has_ice;
	if(fallen_ice_block==0) {
		printf("CIRNO REMOVED AN ICE_BLOCK\n");
		return;
	} else {
		printf("CIRNO REMOVED AN ICE_BLOCK,AND %d BLOCK(S) ARE BROKEN\n",fallen_ice_block);
		return;
	}
}

inline bool InRoom(int R,int C,int H,int Maxdep) {
	return R>Hr&&R<Hr+Hx-1&&C>Hc&&C<Hc+Hy-1&&H<Maxdep;
}
inline bool OutRoom(int R,int C,int H,int Maxdep) {
	return R<Hr||R>Hr+Hx-1||C<Hc||C>Hc+Hy-1||H>Maxdep;
}
inline bool OnTheWall(int R,int C,int H,int Maxdep) {
	return (!InRoom(R,C,H,Maxdep)&&!OutRoom(R,C,H,Maxdep));
}
void MAKE_ROOF() {
	int max_high=0,high_flag=0;
	for(max_high=Hm+1; ~max_high; --max_high) {
		high_flag=0;
		for(int i=0; i<Hx; ++i)
			if(sky_ice[i+Hr][Hc][max_high]||sky_ice[i+Hr][Hc+Hy-1][max_high])high_flag=1;
		for(int i=0; i<Hy; ++i)
			if(sky_ice[Hr][i+Hc][max_high]||sky_ice[Hr+Hx-1][i+Hc][max_high])high_flag=1;
		if(high_flag) break;
	}
	++max_high;
	int ceil_cnt=0;
	for(int i(0); i<Hx; ++i) {
		for(int j(0); j<Hy; ++j) {
			if(!sky_ice[Hr+i][Hc+j][max_high]) {
				sky_ice[Hr+i][Hc+j][max_high]=1;
				++ceil_cnt;
			}
		}
	}
	if(ceil_cnt>has_ice) {
		printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCK(S) TO MAKE ROOF\n");
		return;
	}
	if(max_high<2||(max_high-1)*(Hx-2)*(Hy-2)<2) {
		printf("SORRY CIRNO,HOUSE IS TOO SMALL\n");
		return;
	}
	bool IsPerfect=true;
	int door_x=-1,door_y=-1;
	for(int i(0); i<n; ++i) {
		for(int j(0); j<n; ++j) {
			for(int k(0); k<=Hm; ++k) {
				if(!IsPerfect)break;
				if(sky_ice[i][j][k]) {
					if(!OnTheWall(i,j,k,max_high))IsPerfect=0;
				} else {
					if(OnTheWall(i,j,k,max_high)) {
						if(k>1)IsPerfect=0;
						else {
							if(k==0) {
								if(door_x!=-1||door_y!=-1)IsPerfect=0;
								else if(i==Hr+(Hx-1)/2||i==Hr+Hx/2||j==Hc+(Hy-1)/2||j==Hc+Hy/2) door_x=i,door_y=j;
								else IsPerfect=0;
							} else {
								if(door_x!=i||door_y!=j)IsPerfect=0;
								//第二格的门是否与第一格在一个位置
							}
						}
					}

				}
			}
		}
	}
	if(IsPerfect) {
		printf("0 ICE_BLOCK(S) INSIDE THE HOUSE NEED TO BE REMOVED\n");
		printf("0 ICE_BLOCK(S) OUTSIDE THE HOUSE NEED TO BE REMOVED\n");
		printf("GOOD JOB CIRNO,SUCCESSFULLY BUILT THE HOUSE\n");
		printf("DOOR IS OK\n");
		printf("WALL IS OK\n");
		printf("CORNER IS OK\n");
		printf("CIRNO FINALLY HAS %d ICE_BLOCK(S)\n",has_ice-ceil_cnt);
		printf("CIRNO IS PERFECT!\n");
		return;
	}
	int OutRoom_Ice_Block=0,InRoom_Ice_Block=0;
	has_ice=max(0,has_ice-ceil_cnt);
	for(int i(0); i<n; ++i) {
		for(int j(0); j<n; ++j) {
			for(int k(0); k<=Hm; ++k) {
				if(sky_ice[i][j][k]) {
					if(InRoom(i,j,k,max_high)) {
						++InRoom_Ice_Block;
						sky_ice[i][j][k];
					}
					if(OutRoom(i,j,k,max_high)) {
						++OutRoom_Ice_Block;
						sky_ice[i][j][k];
					}
				}
			}
		}
	}
	has_ice+=InRoom_Ice_Block+OutRoom_Ice_Block;
    //Something Here ...
}

int main() {
	cin>>n>>Hm>>Hr>>Hc>>Hx>>Hy>>m;
	int t1,t2,t3,t4;
	while (m--) {
		cin>>s;
		if(s=="ICE_BARRAGE") {
			cin>>t1>>t2>>t3>>t4;
			ICE_BARRAGE(t1,t2,t3,t4);
			//Print_ice();
		} else if(s=="MAKE_ICE_BLOCK") {
			MAKE_ICE_BLOCK();
		} else if(s=="PUT_ICE_BLOCK") {
			cin>>t1>>t2>>t3;
			PUT_ICE_BLOCK(t1,t2,t3);
		} else if(s=="REMOVE_ICE_BLOCK") {
			cin>>t1>>t2>>t3;
			REMOVE_ICE_BLOCK(t1,t2,t3);
		} else if(s=="MAKE_ROOF") {
			MAKE_ROOF();
		}
	}
	return 0;
}
/*
8
10
4 0 4 4
63
ICE_BARRAGE 2 1 1 3
ICE_BARRAGE 0 1 3 1
*/
2021/10/6 21:09
加载中...