Logo HelloWorld信息学奥赛题库

少儿编程

时间限制:1 s 空间限制:256 MB

#3553. 「JOI Open 2016」JOIRIS

Statistics

题目描述

译自 JOI Open 2016 T1 「JOIRIS」

「井」、「骨牌」及「方块」的翻译参考了俄罗斯方块(Tetris)。

JOIRIS 的游戏区域名叫「井」,是一个宽度为 $N$,高度足够大的矩形网格。位于左数第 $i$ 列,从下往上数第 $j$ 列的格子记作 $(i,j)$。游戏过程中,每个格子要不有一个方块,要不没有方块。
开始时,在第 $i$ 列有且仅有 $(i,1), (i,2),\dots, (i, A_i)$ 有方块。
接下来,$10^4$ 个 $1×K$ 的骨牌一个个下落,玩家要依次放置骨牌。每次放置骨牌按照如下方式进行:

  • 玩家先选择骨牌是横向放置还是纵向放置。
  • 若选择纵向,玩家还需再选择一个整数 $x$ $(1 \le x \le N)$。一个骨牌会下落到第 $x$ 列最上方方块的上面一行。若第 $x$ 列没有方块,骨牌会下落到井底。
  • 若选择横向,玩家还需再选择一个整数 $x$ $(1 \le x \le N-K+1)$。一个骨牌会下落到第 $x$ 列至第 $x+K-1$ 列最上方方块的上面一行。若第 $x$ 列至第 $x+K-1$ 列没有方块,骨牌会下落到井底。
  • 每个骨牌停止下落后,系统将从井底往上逐行检查,如果有一行格子被方块填满,该行的所有方块都会消失,且上方的所有方块向下移动 $1$ 格。
  • 此时检查井中是否有方块,如果井中没有方块,游戏结束,玩家胜利,否则玩家开始放置下一个骨牌。

保证开始时最底下一行没有被方块填满。请判断玩家能否胜利,如果可能,则输出一种方案。

输入格式

第一行含有两个整数 $N,K$。
在接下来的 $N$ 行中,第 $i$ 行 $(1 \le i \le N)$ 有一个整数 $A_i$。

输出格式

赢不了请输出 $-1$。
能赢请输出 $X+1$ 行,其中 $X$ 表示消去所有棋子所需要的步数。 第一行包含一个整数 $X$。 接下来第 $i$ 行($1 \le i \le X$)表示你的方案。

  • 如果第 $i$ 个下落的骨牌纵向放置,输出两个整数,第一个整数为 $1$,第二个整数 $x$ 表示玩家放置零件的位置(如题目描述中所述)。
  • 如果第 $i$ 个下落的骨牌横向放置,输出两个整数,第一个整数为 $2$,第二个整数 $x$ 表示玩家放置零件的位置(如题目描述中所述)。

样例 1

input

4 2
1
0
1
2

output

4
2 2
1 1
2 3
1 2

JOI-Open-16-T1.png

样例 2

input

3 2
2
0
1

output

3
1 2
1 3
2 1

样例 3

input

2 2
0
1

output

-1

样例 4

input

5 3
1
0
1
0
1

output

9
1 4
1 5
2 1
2 1
2 2
1 1
1 2
2 3
2 3

数据范围与提示

对于所有数据,$2\le N\le 50,$ $1\le K\le N,$ $0\le A_i \le 50$。

子任务编号 分值 $K$ $N$
$1$ $15$ $K=2$ $N$ 是偶数
$2$ $15$ $K=2$ $N$ 是奇数
$3$ $15$ $K$ 整除 $N$ -
$4$ $55$ - -