NC205930. 俄罗斯方块
描述
输入描述
第一行输入一个正整数n,表示接下来有n个图案落下,保证0<=n<=10。接下来n行,每行两个数字id,x。id表示图案的种类,保证1<=id<=4。x表示图案的左下角所在的横坐标。保证数据合法,不会出现超出10*10边界的情况。
输出描述
输出一个10*10大小的矩阵表示最后的形状,保证输出的图案一定可以放在10*10的矩阵中。
示例1
输入:
3 4 1 1 4 2 1
输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
说明:
如图为样例一的情形C(clang 3.9) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2020-05-25 13:57:26
#include<stdio.h> #include<stdlib.h> int x[11][11]; int main(){ int n; int a,b; scanf("%d",&n); while(n--){ scanf("%d %d",&a,&b); if(a==1){ int i=1; while(!x[i][b]&&!x[i][b+1]&&i<11)i++; i--; x[i][b]=1; x[i][b+1]=1; x[i-1][b]=1; x[i-1][b+1]=1; } else if(a==2){ int i=1; while(!x[i][b]&&!x[i][b+1]&&!x[i][b+2]&&i<11)i++; i--; x[i][b]=1; x[i][b+1]=1; x[i-1][b]=1; x[i][b+2]=1; } else if(a==3){ int i=1; while(!x[i][b]&&!x[i][b+1]&&!x[i][b+3]&&!x[i][b+2]&&i<11)i++; i--; x[i][b]=1; x[i][b+1]=1; x[i][b+3]=1; x[i][b+2]=1; } else { int i=1; while(!x[i][b]&&!x[i][b+1]&&!x[i][b+2]&&i<11)i++; i--; x[i][b]=1; x[i][b+1]=1; x[i-1][b+1]=1; x[i][b+2]=1; } } for(int i=1;i<11;i++){ for(int j=1;j<11;j++){ printf("%d ",x[i][j]); } printf("\n"); } return 0; }
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2020-05-24 14:30:06
#include<iostream> using namespace std; int dx[5][4]={0,0,0,0, 0,-1,-1,0, -1,0,0,0, 0,0,0,0, 0,0,0,-1},dy[5][4]={0,0,0,0, 0,0,1,1, 0,0,1,2, 0,1,2,3, 0,1,2,1}; int a[12][12]; int judge(int n,int p){ int x=0; for(x=1;x<=10;x++){ bool ok=false; for(int i=0;i<4;i++){ int ox=x+dx[n][i],oy=p+dy[n][i]; if(a[ox][oy]){ ok=true; break; } } if(ok){ return x-1; } } return 10; } void place(int n,int x,int y){ for(int i=0;i<4;i++){ a[x+dx[n][i]][y+dy[n][i]]=1; } } int main(){ int t; cin>>t; while(t--){ int n,p; cin>>n>>p; int x=judge(n,p); place(n,x,p); } for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ printf("%d ",a[i][j]); } cout<<endl; } return 0; }
Python3(3.5.2) 解法, 执行用时: 22ms, 内存消耗: 3560K, 提交时间: 2020-05-24 13:41:54
n = int(input()); grid = [[0 for j in range(11)] for i in range(10)]; width = {1:2, 2:3, 3:4, 4:3}; upper = {1:[0,1], 2:[0], 3:[], 4:[1]}; highest = [0]*11; lower = 10; tp = 0; x = 0; for i in range(n): tp, x = map(int,(input().split(" "))); lower = highest[x]; for k in range(1,width[tp]): if(lower < highest[k+x]): lower = highest[k+x]; for i in range(width[tp]): grid[lower][x+i] = 1; highest[x+i] = lower + 1; for i in upper[tp]: grid[lower+1][x+i] = 1; highest[x+i] = lower + 2; for i in range(9,-1,-1): for j in range(1,11): print(grid[i][j], end = ' '); print();
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2020-06-29 00:12:27
#include<bits/stdc++.h> using namespace std; int main() { int i,j,k,id,x,n; bool flag,ans[15][15]={0}; scanf("%d",&n); while(n--) { scanf("%d%d",&id,&x),x--; for(i=0;i<=9;i++) { for(flag=0,j=x;j<x+1+(id&1?id:2);j++)flag|=ans[i][j]; if(flag)break; } if(id==1) { for(j=i-1;j>i-3;j--) for(k=x;k<x+2;k++)ans[j][k]=1; } else if(id==2) { for(k=x;k<x+3;k++)ans[i-1][k]=1; ans[i-2][x]=1; } else if(id==3)for(k=x;k<x+4;k++)ans[i-1][k]=1; else { for(k=x;k<x+3;k++)ans[i-1][k]=1; ans[i-2][x+1]=1; } } for(i=0;i<=9;i++) { for(j=0;j<=9;j++)printf("%d ",ans[i][j]); printf("\n"); } }