列表

详情


NC205930. 俄罗斯方块

描述

玩一个简化版的俄罗斯方块,只有10*10大小的二维平面,且只有四种图案,不会翻转,一行满后不消除,四种图案对应四个编号1,2,3,4,现在给出你所有图案按照先后顺序的下落坐标,你可以将最后的样子输出吗?
注:一个点处如果有方块存在则表示成1,否则为0,也即最后输出一个10*10的01矩阵。
1:

2:

3:

4:

输入描述

第一行输入一个正整数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");
	}
}

上一题