3 条题解
-
0
搬运工 (syrth0p1) LV 10 @ 2025-06-09 20:26:36
#include<bits/stdc++.h> using namespace std; char base[20][20]={"", "\0 +-------+", "\0 /4\\1111\'/|", "\0 /44.*\'22/1|", "\0 /.3333\\2/1/|", "\0+-------+1.2|", "\0|\\11111/|\\:2|", "\0|4\\111/2|4*2|", "\0|44\\1/22|4:\\|", "\0|444X222|4\'3+", "\0|44/3\\22|/3/ ", "\0|4/333\\2|3/ ", "\0|/33333\\|/ ", "\0+-------+ "}; const int baseh=13; char ans[5001][5001];int cnt[101][101];int n,m;int ansh,answ; char getcube[20][20]; inline void setit(int startx,int starty){for(int i=13,x=startx;i>=1;i--,x--) for(int j=1,y=starty;j<=13;j++,y++) if(getcube[i][j]!=' ') ans[x][y]=getcube[i][j];} struct Col { bool R,B,G;Col(){R=B=G=0;}Col(char c){R=B=G=0;if(c=='R')R=1;if(c=='B') B=1;if(c=='G')G=1;} inline char getcol() { if(R==0&&B==0&&G==0) return 'K';if(R==0&&B==0&&G==1) return 'G'; if(R==0&&B==1&&G==0) return 'B';if(R==0&&B==1&&G==1) return 'C'; if(R==1&&B==0&&G==0) return 'R';if(R==1&&B==0&&G==1) return 'Y'; if(R==1&&B==1&&G==0) return 'P';if(R==1&&B==1&&G==1) return 'W'; assert(0);return '\0'; } }; inline Col operator +(const Col &a,const Col &b){Col res;res.R=a.R||b.R;res.B=a.B||b.B;res.G=a.G||b.G;return res;} inline void Add(Col &a,char c){a=a+Col(c);} //个人认为这样定义可以方便处理颜色重叠的问题 char light[4][4]; struct Block { Col Ul,Ur,Uf,Ub; Col Fu,Fd,Fl,Fr; Col Ru,Rd,Rf,Rb; inline void Getcube() { for(int i=1;i<=baseh;i++) for(int j=1;j<=baseh;j++) { getcube[i][j]=base[i][j]; if(i>=6&&j<=9) { if(base[i][j]=='1') getcube[i][j]=Fu.getcol(); if(base[i][j]=='2') getcube[i][j]=Fr.getcol(); if(base[i][j]=='3') getcube[i][j]=Fd.getcol(); if(base[i][j]=='4') getcube[i][j]=Fl.getcol(); } if(i>=5&&j>9) { if(base[i][j]=='1') getcube[i][j]=Ru.getcol(); if(base[i][j]=='2') getcube[i][j]=Rb.getcol(); if(base[i][j]=='3') getcube[i][j]=Rd.getcol(); if(base[i][j]=='4') getcube[i][j]=Rf.getcol(); } if(i<5) { if(base[i][j]=='1') getcube[i][j]=Ub.getcol(); if(base[i][j]=='2') getcube[i][j]=Ur.getcol(); if(base[i][j]=='3') getcube[i][j]=Uf.getcol(); if(base[i][j]=='4') getcube[i][j]=Ul.getcol(); } } getcube[3][12]=Ru.getcol(); getcube[4][11]=Ru.getcol(); }//将这个立方体的实际输出放到getcube[][]字符数组中 }a[101][101][101]; inline void SolveUpColor() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int high=cnt[i][j]; a[i][j][high].Ub=a[i][j][high].Uf=a[i][j][high].Ul=a[i][j][high].Ur=Col(light[2][2]); //light from up bool flag1=1,flag2=1;//flag1:left front,flag2:right back int curx=i-1,cury=j-1,curcnt=1; while(curx&&cury&&flag1){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=flag2=0;curx--;cury--;curcnt++;} curx=i;cury=j-1;curcnt=1; while(flag1&&curx&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx--;cury--;curcnt++;} curx=i-1;cury=j;curcnt=1; while(flag2&&curx&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag2=0;curx--;cury--;curcnt++;} if(flag1) Add(a[i][j][high].Ul,light[1][1]),Add(a[i][j][high].Uf,light[1][1]); if(flag2) Add(a[i][j][high].Ub,light[1][1]),Add(a[i][j][high].Ur,light[1][1]); //light from left back flag1=1;curx=i-1;cury=j;curcnt=1; while(flag1&&curx){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx--;curcnt++;} if(flag1) { Add(a[i][j][high].Ul,light[1][2]),Add(a[i][j][high].Uf,light[1][2]); Add(a[i][j][high].Ub,light[1][2]),Add(a[i][j][high].Ur,light[1][2]); } //light from back flag1=flag2=1;curx=i-1,cury=j+1;curcnt=1;//flag1:left back,flag2:right front while(flag1&&curx&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=flag2=0;curx--;cury++;curcnt++;} curx=i-1,cury=j;curcnt=1; while(flag1&&curx&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx--;cury++;curcnt++;} curx=i;cury=j+1;curcnt=1; while(flag2&&curx&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag2=0;curx--;cury++;curcnt++;} if(flag1) Add(a[i][j][high].Ul,light[1][3]),Add(a[i][j][high].Ub,light[1][3]); if(flag2) Add(a[i][j][high].Uf,light[1][3]),Add(a[i][j][high].Ur,light[1][3]); //light from right back flag1=1;curx=i;cury=j-1;curcnt=1; while(flag1&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;cury--;curcnt++;} if(flag1) { Add(a[i][j][high].Ul,light[2][1]),Add(a[i][j][high].Uf,light[2][1]); Add(a[i][j][high].Ub,light[2][1]),Add(a[i][j][high].Ur,light[2][1]); } //light from left flag1=1;curx=i;cury=j+1;curcnt=1; while(flag1&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;cury++;curcnt++;} if(flag1) { Add(a[i][j][high].Ul,light[2][3]),Add(a[i][j][high].Uf,light[2][3]); Add(a[i][j][high].Ub,light[2][3]),Add(a[i][j][high].Ur,light[2][3]); } //light from right flag1=flag2=1;curx=i+1;cury=j-1;curcnt=1;//flag1:left back,flag2:right front while(flag1&&curx<=n&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=flag2=0;curx++;cury--;curcnt++;} curx=i;cury=j-1;curcnt=1; while(flag1&&curx<=n&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx++;cury--;curcnt++;} curx=i+1;cury=j;curcnt=1; while(flag2&&curx<=n&&cury){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag2=0;curx++;cury--;curcnt++;} if(flag1) Add(a[i][j][high].Ul,light[3][1]),Add(a[i][j][high].Ub,light[3][1]); if(flag2) Add(a[i][j][high].Uf,light[3][1]),Add(a[i][j][high].Ur,light[3][1]); //light from left front flag1=1;curx=i+1;cury=j;curcnt=1; while(flag1&&curx<=n){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx++;curcnt++;} if(flag1) { Add(a[i][j][high].Ul,light[3][2]),Add(a[i][j][high].Uf,light[3][2]); Add(a[i][j][high].Ub,light[3][2]),Add(a[i][j][high].Ur,light[3][2]); } //light from front flag1=flag2=1;curx=i+1;cury=j+1;curcnt=1;//flag1:left front,flag2:right back while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=flag2=0;curx++;cury++;curcnt++;} curx=i+1;cury=j;curcnt=1; while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag1=0;curx++;cury++;curcnt++;} curx=i;cury=j+1;curcnt=1; while(flag2&&curx<=n&&cury<=m){if(cnt[curx][cury]-cnt[i][j]>=curcnt) flag2=0;curx++;cury++;curcnt++;} if(flag1) Add(a[i][j][high].Ul,light[3][3]),Add(a[i][j][high].Uf,light[3][3]); if(flag2) Add(a[i][j][high].Ur,light[3][3]),Add(a[i][j][high].Ub,light[3][3]); //light from right front } }//处理顶面的颜色 inline void SolveRightColor() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int high=1;high<=cnt[i][j];high++) { if(j<m&&cnt[i][j+1]>=cnt[i][j]) continue; int flag1,flag2;int curx,cury,curhigh; flag1=1;curx=i;cury=j+1;curhigh=high; while(flag1&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=0;cury++;curhigh++;} if(flag1) { Add(a[i][j][high].Rb,light[2][3]);Add(a[i][j][high].Rd,light[2][3]); Add(a[i][j][high].Rf,light[2][3]);Add(a[i][j][high].Ru,light[2][3]); } //light from right flag1=flag2=1;curx=i+1;cury=j+2;curhigh=high+1;//flag1:up back,flag2:front down while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury++;curhigh++;} curx=i+1;cury=j+1;curhigh=high+1; while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury++;curhigh++;} curx=i+1;cury=j+1;curhigh=high; while(flag2&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag2=0;curx++;cury++;curhigh++;} if(flag1) Add(a[i][j][high].Ru,light[3][3]),Add(a[i][j][high].Rb,light[3][3]); if(flag2) Add(a[i][j][high].Rf,light[3][3]),Add(a[i][j][high].Rd,light[3][3]); //light from right front flag1=flag2=1;curx=i-1;cury=j+2;curhigh=high+1;//flag1:up front,flag2:down back while(flag1&&curx&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx--;cury++;curhigh++;} curx=i-1;cury=j+1;curhigh=high+1; while(flag1&&curx&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx--;cury++;curhigh++;} curx=i-1;cury=j+1;curhigh=high; while(flag2&&curx&&cury<=m){if(cnt[curx][cury]>=curhigh) flag2=0;curx--;cury++;curhigh++;} if(flag1) Add(a[i][j][high].Ru,light[1][3]),Add(a[i][j][high].Rf,light[1][3]); if(flag2) Add(a[i][j][high].Rd,light[1][3]),Add(a[i][j][high].Rb,light[1][3]); //light from right back } }//处理右面的颜色 inline void SolveFrontColor(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int high=1;high<=cnt[i][j];high++) { if(i<n&&cnt[i+1][j]>=cnt[i][j]) continue; int flag1,flag2,curx,cury,curhigh; flag1=1;curx=i+2;cury=j;curhigh=high+1; while(flag1&&curx<=n){if(cnt[curx][cury]>=curhigh) flag1=0;curx++;curhigh++;} if(flag1) { Add(a[i][j][high].Fd,light[3][2]);Add(a[i][j][high].Fl,light[3][2]); Add(a[i][j][high].Fr,light[3][2]);Add(a[i][j][high].Fu,light[3][2]); } //light from front flag1=flag2=1;curx=i+1;cury=j+1;curhigh=high+1;//flag1:left up,flag2:right down while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury++;curhigh++;} curx=i+2;cury=j+1;curhigh=high+1; while(flag1&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury++;curhigh++;} curx=i+1;cury=j+1;curhigh=high; while(flag2&&curx<=n&&cury<=m){if(cnt[curx][cury]>=curhigh) flag2=0;curx++;cury++;curhigh++;} if(flag1) Add(a[i][j][high].Fl,light[3][3]),Add(a[i][j][high].Fu,light[3][3]); if(flag2) Add(a[i][j][high].Fr,light[3][3]),Add(a[i][j][high].Fd,light[3][3]); //light from right front flag1=flag2=1;curx=i+1;cury=j-1;curhigh=high+1;//flag1:right up,flag2:left down while(flag1&&curx<=n&&cury){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury--;curhigh++;} curx=i+2;cury=j-1;curhigh=high+1; while(flag1&&curx<=n&&cury){if(cnt[curx][cury]>=curhigh) flag1=flag2=0;curx++;cury--;curhigh++;} curx=i+1;cury=j-1;curhigh=high; while(flag2&&curx<=n&&cury){if(cnt[curx][cury]>=curhigh) flag2=0;curx++;cury--;curhigh++;} if(flag1) Add(a[i][j][high].Fr,light[3][1]),Add(a[i][j][high].Fu,light[3][1]); if(flag2) Add(a[i][j][high].Fl,light[3][1]),Add(a[i][j][high].Fd,light[3][1]); //light from left front } }//处理前面的颜色 inline void print() { ansh=0;answ=1+m*8+n*4; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ansh=max(ansh,1+4*(n-i+1)+8*cnt[i][j]); for(int i=1;i<=ansh;i++) for(int j=1;j<=answ;j++) ans[i][j]=' '; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=cnt[i][j];k++) { int getx=ansh-4*(n-i)-8*(k-1),gety=1+(j-1)*8+(n-i)*4; a[i][j][k].Getcube(); setit(getx,gety); } for(int i=1;i<=ansh;i++) { for(int j=1;j<=answ;j++) putchar(ans[i][j]); putchar('\n'); } }//输出不解释了 inline void init() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&cnt[i][j]); for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>light[i][j]; } int main() { init(); SolveUpColor(); SolveRightColor(); SolveFrontColor(); print(); return 0; }
-
02015-10-04 17:24:50@
-
02015-06-03 12:51:01@
样例输出的格式有可能出现混乱,所以我在这里额外给出来一下两个样例的输出。
+-------+
/Y\YYYY'/|
/YY.*'YY/G|
/.YYYY\Y/G/|
+-------+G.G|
|\GGGGG/|:G|
|G\GGG/G|G*G|
|GG\G/GG|G:|
|GGGXGGG|G'G+-------+
|GG/G\GG|/G/G\YYYY'/|
|G/GGG\G|G/GG.*'YY/G|
|/GGGGG|/.GGGG\Y/G/|
+-------+-------+G.G|
/Y\GGGG'/G\GGGG'/|:G|
/YY.*'GG/GG.*'GG/G|G*G|
/.YYYY\G/.GGGG\G/G/|G:|
+-------+-------+G.G|G'G+
|\GGGGG/|\GGGGG/|:G|/G/
|G\GGG/G|G\GGG/G|G*G|G/
|GG\G/GG|GG\G/GG|G:|/
|GGGXGGG|GGGXGGG|G'G+
|GG/G\GG|GG/G\GG|/G/
|G/GGG\G|G/GGG\G|G/
|/GGGGG|/GGGGG|/
+-------+-------++-------+
/W\WWWW'/|
/WW.*'WW/C|
/.WWWW\W/C/|
+-------+-------+-------+
/W\WWWW'/|\YYYYY/W\WWWW'/|
/WW.*'WW/C|G\YYY/WW.*'WW/C|
/.WWWW\W/C/|GG\Y/.WWWW\W/C/|
+-------+-------+-------+-------+C.C|---+
/W\WWWW'/|\YYYYY/W\WWWW'/|\YYYYY/|:C|C'/|
/WW.*'WW/C|G\YYY/WW.*'WW/C|G\YYY/Y|C*C|C/C|
/.WWWW\W/C/|GG\Y/.WWWW\W/C/|GG\Y/YY|C:|/C/|
+-------+C.G|GGG+-------+C.G|GGGXYYY|C'C+C.C|
|\YYYYY/|:G|GG/|\YYYYY/|:G|GG/G\YY|/C/|:C|
|Y\YYY/Y|C*G|G/K|Y\YYY/Y|C*G|G/GGG\Y|C/C|C*C|
|YY\Y/YY|C:|/KK|YY\Y/YY|C:|/GGGGG|/C/|C:|
|YYYXYYY|C'G+---|YYYXYYY|C'G+-------+C.C|C'C+
|YY/Y\YY|/G/G\KK|YY/Y\YY|/G/G\GGGG'/|:C|/C/
|Y/YYY\Y|G/GG.*'|Y/YYY\Y|G/GG.*'WW/C|C*C|C/
|/YYYYY|/.YYYY|/YYYYY|/.WWWW\W/C/|C:|/
+-------+-------+-------+-------+C.C|C'C+
|\YYYYY/|\YYYYY/|\YYYYY/|\YYYYY/|:C|/C/
|Y\YYY/Y|Y\YYY/Y|Y\YYY/Y|Y\YYY/Y|C*C|C/
|YY\Y/YY|YY\Y/YY|YY\Y/YY|YY\Y/YY|C:|/
|YYYXYYY|YYYXYYY|YYYXYYY|YYYXYYY|C'C+
|YY/Y\YY|YY/Y\YY|YY/Y\YY|YY/Y\YY|/C/
|Y/YYY\Y|Y/YYY\Y|Y/YYY\Y|Y/YYY\Y|C/
|/YYYYY|/YYYYY|/YYYYY|/YYYYY|/
+-------+-------+-------+-------+
- 1
信息
- ID
- 1963
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 46
- 已通过
- 8
- 通过率
- 17%
- 被复制
- 2
- 上传者