其他都对,MAKE_ROOF
连 Perfect
都判不了,求助!
/*
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
*/