NC15807. twh233打方块
描述
输入描述
第1行至第15行每一行包含10个字符, 代表游戏当前的局面
('#'代表该位置有方块, '*'代表该位置为空)
输出描述
输出一个非负整数, 代表twh233指定某个方块下落, 通过旋转和平移操作后, 他本次能得到的最高分
示例1
输入:
********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** #########* #########* #########* #########*
输出:
4
说明:
此时游戏局面为:示例2
输入:
********** ********** ********** ********** ********** ********** ********** ********** **#***#*** *###*###** #########* *#######** **#####*** ***###**** ****#*****
输出:
1
说明:
示例3
输入:
********** ********** ********** ********** ********** ###***##** #****#**#* ###**#**#* #****#**#* #*****##** #****###** #****#**#* #****#**#* #****#**#* ###**###**
输出:
0
说明:
此时游戏局面为: , 无论接下来是哪一个方块下落, twh233都不能得分示例4
输入:
********** ********** ********** ********** ********** #########* **#**#**#* ######**#* #**#****#* ######**#* #*#######* #*#**##*#* #######*#* **##**#*#* **#######*
输出:
1
说明:
此时游戏局面为:C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2019-01-19 19:42:06
#include<bits/stdc++.h> using namespace std; struct block { bool a[5][5]; int l,r; block() {memset(a,0,sizeof(a));} }; vector<block>G; void make(int b,int c,int d,int e,int f,int g,int h,int i,int l,int r) { block x; x.a[b][c]=1,x.a[d][e]=1; x.a[f][g]=1,x.a[h][i]=1; x.l=l,x.r=r;G.push_back(x); } void init() { make(1,1,1,2,1,3,1,4,1,4); make(1,1,2,1,3,1,4,1,1,1); make(1,1,2,1,2,2,2,3,1,3); make(1,1,1,2,2,1,3,1,1,2); make(1,1,1,2,1,3,2,3,1,3); make(1,2,2,2,3,2,3,1,1,2); make(2,1,2,2,2,3,1,3,1,3); make(1,1,2,1,3,1,3,2,1,2); make(1,1,1,2,1,3,2,1,1,3); make(1,1,1,2,2,2,3,2,1,2); make(1,1,1,2,2,1,2,2,1,2); make(1,2,1,3,2,1,2,2,1,3); make(1,1,2,1,2,2,3,2,1,2); make(1,1,1,2,2,2,2,3,1,3); make(1,2,2,1,2,2,3,1,1,2); make(1,2,2,2,2,1,2,3,1,3); make(1,2,2,1,2,2,3,2,1,2); make(1,1,2,1,3,1,2,2,1,2); make(1,1,1,2,1,3,2,2,1,3); } char a[20][15]; int down(int i,int j) { int l=j,r=j+G[i].r-1; for(int k=1;;k++) for(int x1=1,x2=k;x1<=4; x1++,x2++) for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++) if(G[i].a[x1][y1] && a[x2][y2]=='#') return k-1; } void add(int i,int j,int k,bool op) { int l=j,r=j+G[i].r-1; for(int x1=1,x2=k;x1<=4; x1++,x2++) for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++) if(G[i].a[x1][y1]) a[x2][y2]=op?'#':'*'; } int cal() { int res=0; for(int i=1;i<=15;i++) { bool flag=true; for(int j=1;j<=10;j++) if(a[i][j]=='*') flag=false; if(flag)res++; } return res; } int main() { init(); for(int i=1;i<=15;i++)scanf("%s",a[i]+1); for(int i=1;i<=10;i++)a[16][i]='#'; int ans=0; for(int i=0;i<G.size();i++) for(int j=1;j+G[i].r<=11;j++) { int k=down(i,j); add(i,j,k,true); ans=max(ans,cal()); add(i,j,k,false); } return !printf("%d\n",ans); }
C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2018-05-06 00:52:17
#include<bits/stdc++.h> using namespace std; struct block { bool a[5][5]; int l,r; block() {memset(a,0,sizeof(a));} }; vector<block>G; void make(int b,int c,int d,int e,int f,int g,int h,int i,int l,int r) { block x; x.a[b][c]=1,x.a[d][e]=1; x.a[f][g]=1,x.a[h][i]=1; x.l=l,x.r=r;G.push_back(x); } void init() { make(1,1,1,2,1,3,1,4,1,4); make(1,1,2,1,3,1,4,1,1,1); make(1,1,2,1,2,2,2,3,1,3); make(1,1,1,2,2,1,3,1,1,2); make(1,1,1,2,1,3,2,3,1,3); make(1,2,2,2,3,2,3,1,1,2); make(2,1,2,2,2,3,1,3,1,3); make(1,1,2,1,3,1,3,2,1,2); make(1,1,1,2,1,3,2,1,1,3); make(1,1,1,2,2,2,3,2,1,2); make(1,1,1,2,2,1,2,2,1,2); make(1,2,1,3,2,1,2,2,1,3); make(1,1,2,1,2,2,3,2,1,2); make(1,1,1,2,2,2,2,3,1,3); make(1,2,2,1,2,2,3,1,1,2); make(1,2,2,2,2,1,2,3,1,3); make(1,2,2,1,2,2,3,2,1,2); make(1,1,2,1,3,1,2,2,1,2); make(1,1,1,2,1,3,2,2,1,3); } char a[20][15]; int down(int i,int j) { int l=j,r=j+G[i].r-1; for(int k=1;;k++) for(int x1=1,x2=k;x1<=4; x1++,x2++) for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++) if(G[i].a[x1][y1] && a[x2][y2]=='#') return k-1; } void add(int i,int j,int k,bool op) { int l=j,r=j+G[i].r-1; for(int x1=1,x2=k;x1<=4; x1++,x2++) for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++) if(G[i].a[x1][y1]) a[x2][y2]=op?'#':'*'; } int cal() { int res=0; for(int i=1;i<=15;i++) { bool flag=true; for(int j=1;j<=10;j++) if(a[i][j]=='*') flag=false; if(flag)res++; } return res; } int main() { init(); for(int i=1;i<=15;i++)scanf("%s",a[i]+1); for(int i=1;i<=10;i++)a[16][i]='#'; int ans=0; for(int i=0;i<G.size();i++) for(int j=1;j+G[i].r<=11;j++) { int k=down(i,j); add(i,j,k,true); ans=max(ans,cal()); add(i,j,k,false); } return !printf("%d\n",ans); }