#NOI20022B. 新俄罗斯方块

新俄罗斯方块

Description

圆圆玩腻了传统的“俄罗斯方块” 游戏,发明了一种新的玩法:游戏在一个无限高的N列棋盘中进行,棋盘的各列从左到右依次编号为1,2,…N。在游戏中,游戏者可以使用如图1所示的19种形状的基块,无论哪一种基块都是由四个小方块连接起来的。图上标有基块形状编号T(1 <= T <= 19): image

棋局描述与游戏规则:

1. 棋盘中棋局状态的描述:游戏中所有可能的棋局状态都用每列连在一起的小方块数来描述。例如图2的棋局,棋盘为4列,N = 4,第1列有3个小方块;第2列有2个小方块;第3列有3个小方块;第4列有0个小方块。因此,可以用(3, 2, 3, 0)来描述这一棋局。

2. 游戏时先选基块T(1 <= T <= 19),再将它放到该放的列C(1 <= C <= N)上去,称之为指令(T, C),含意是,将形状编号为T的基块的最左边的小方块对准C列放下。比如对图2的棋局,选T = 1的基块,放至第4列,即指令(1, 4),基块可落下至底部,刚刚执行完指令(1, 4)之后的棋局为(3, 2, 3, 4),由于底部两行是占满的,游戏规则让占满的两行自动消失,得到的棋局为图3,可描述为(1, 0, 1, 2)。

3. 当棋盘上每一列的小方块数都为0时游戏结束。比如在图3的棋局上,选择9号基块,让其最左边的小方块处于棋盘上的第1列,即指令(9, 1),从上往下落到底,则得棋局状态为(2, 2, 2, 2),占满两行,自动消失后得(0, 0, 0, 0),游戏成功结束。

4. 游戏规定在放每一个基块时都不允许越出棋盘边界。比如图2,N = 4,指令(18, 4)会越界。

5.游戏还规定不允许出现“悬空”的小方块。“悬空”的含意是,在同一列上,所有小方块没有连在一起。比如图5属于这种情况。在图2的棋局下,指令(2, 1),(17, 2),(10, 3)是非法的。 image

虽然任意选择形状会让游戏容易许多,可要把方块弄得一块也不剩仍然是件很头疼的事情。你愿意试试吗?现在把“新俄罗斯方块”这个游戏程序交给你。该程序可以读入你的(T,C)指令,告诉你指令完成后的棋局状态。

Format

Input

输入文件tetris1.in到tetris10.in已经放在用户目录中,文件第一行包含一个整数N,即棋盘的列数,第二行包含N个整数,分别表示各列包含的连在一起的小方块数。

Output

本题是一道提交答案式的题目。 你应当提供十个输出文件tetris1.out到tetris10.out,放在用户目录中。每个文件包含若干行,每一行为两个整数T,C,依次表示各条指令。输入数据保证有解。当解不唯一时,任意输出一组解即可。

Samples

4
3   2   3   0
1   4
9   1

Limitation

【评分标准】

对于每个测试点,如果你的输出不正确或者指令条数超过1,000,000,得0分;如果你的输出正确且指令不超过100,000条,你可以得到10分;如果你的输出正确,但指令超过100,000条,你就只能得到7分。

【你如何测试自己的输出】

圆圆的游戏程序game放在用户目录下。使用方法为: game <测试点编号X>。程序会自动读取输入文件tetrisX.in和你的输出文件tetrisX.out,其中X=1,2,…,10。

  • 如果game异常退出,你的输出视为错误;
  • 如果你的输出文件非法,game将指出第一个有错误的行;
  • 如果输出合法,game会产生一个tetris.log。该文件的第一行包含列数N,第二行,有N个整数,依次表示按照你的输出进行游戏后各列连在一起的小方块的个数。
  • game程序会同时在屏幕上输出你的得分。