主题:泡泡龙
&佑慧妹妹&
[专家分:660] 发布于 2007-05-12 15:43:00
问题描述:这是一个简化版的网络游戏:在一个N N方块构成的棋盘中,每个方块均涂上红、黄、蓝、绿(记为1、2、3、4)中的一种颜色,游戏者可以在最底行任意找一个方块,用鼠标双击这个方块,于是该方块及与之相邻(即在上、下、左、右四个方向上有公共边)的所有的同色方块均被消掉,而因下方失去支持的方块将会自由落下填补空位。下图左边给出一个4 4的棋盘样例,当游戏者双击最底层左边第二个方块后,将会形成右边的布局。
你的任务是编写一个泡泡龙模拟程序,对于给定的一个初始棋盘,计算游戏者双击最底层某个方块后棋盘的布局将会如何。
输入:输入文件H.in,第一行有两个正整数N和M(1≤M≤N≤100),其中N表示棋盘的规模,而M则表示游戏者将双击最底层从左边数起的第M个方块。
接下来的N行每行有N个1至4的整数组成,表示一个初始的棋盘,同一行相邻两个数之间用一个空格隔开。
输出:输出文件H.out也有N行,每行用N个数给出游戏结束后棋盘的布局,没有方块的格子用0表示,同一行相邻两个数之间也用一个空格分开。
输入输出样例:
输入样例 输出样例
4 2 1 2 3 4 4 2 4 4 3 4 4 3 1 4 4 3 1 0 0 0 4 0 0 3 3 2 0 3 4 2 3 3
回复列表 (共13个回复)
11 楼
Mato完整版 [专家分:1270] 发布于 2008-04-27 12:35:00
找到方法了。
DECLARE SUB delblock (x!, y!)
CLS
DIM SHARED n
OPEN "H.in" FOR INPUT AS #1
INPUT #1, n, m
DIM SHARED a(1 TO n, 1 TO n), k
FOR i = 1 TO n: FOR j = 1 TO n
INPUT #1, a(i, j)
NEXT j, i
CLOSE #1
k = a(n, m)
CALL delblock(n, m)
FOR i = n - 1 TO 1 STEP -1
FOR j = 1 TO n
s = i
DO
s = s + 1
IF s > n THEN EXIT DO
IF a(s, j) <> 0 THEN EXIT DO
a(s, j) = a(s - 1, j): a(s - 1, j) = 0
LOOP
NEXT j, i
FOR i = 1 TO n: FOR j = 1 TO n
PRINT a(i, j);
NEXT j: PRINT : NEXT i
SUB delblock (x, y)
IF a(x, y) = k THEN
a(x, y) = 0
IF x > 1 THEN CALL delblock(x - 1, y)
IF x < n THEN CALL delblock(x + 1, y)
IF y > 1 THEN CALL delblock(x, y - 1)
IF y < n THEN CALL delblock(x, y + 1)
END IF
END SUB
12 楼
moz [专家分:37620] 发布于 2008-04-27 17:50:00
H.in 文件在哪?
13 楼
FFKK [专家分:1610] 发布于 2009-10-27 20:19:00
DECLARE SUB changecolor (c!, t!)
DECLARE SUB win ()
DECLARE SUB lose ()
DIM SHARED circlecolor0, squarecolor0
CLS
SCREEN 12
bomb = 20
LOCATE 13, 30: PRINT "Loading..."
FOR i = 1 TO 1000000: NEXT i: CLS
squarecolor = 1: circlecolor = 1
LOCATE 1, 1: PRINT "bomb:"; bomb
LINE (270, 20)-(320, 70), squarecolor, BF
CIRCLE (300, 400), 30, circlecolor
PAINT (300, 400), circlecolor
DO
FOR i = 1 TO 300000: NEXT i
CALL changecolor(1, INT(RND * 15) + 1)
d$ = INKEY$: d$ = UCASE$(d$)
IF d$ >= "1" AND d$ <= "9" OR d$ >= "A" AND d$ <= "F" THEN
f = INSTR("123456789ABCDEF", d$)
CALL changecolor(2, f)
LINE (270, 20)-(320, 70), squarecolor0, BF
squarecolor = squarecolor0
ELSEIF d$ = "K" THEN
LOCATE 13, 10: PRINT "Square"; squarecolor; "VS circle"; circlecolor;
IF squarecolor = circlecolor THEN
PRINT "--> Success!"
bomb = bomb + 3
IF bomb >= 40 THEN CALL win
ELSE
PRINT "--> Fail!"
bomb = bomb - 1
IF bomb = 0 THEN CALL lose
END IF
k$ = INPUT$(1)
LOCATE 13, 10: PRINT " "
LOCATE 1, 1: PRINT "bomb:"; bomb
END IF
CIRCLE (300, 400), 30, circlecolor0
PAINT (300, 400), circlecolor0
circlecolor = circlecolor0
LOOP
END
SUB changecolor (c, t)
IF c = 1 THEN
CIRCLE (300, 400), 30, 0
PAINT (300, 400), 0
circlecolor0 = t
ELSE
LINE (270, 20)-(320, 70), 0, BF
squarecolor0 = t
END IF
END SUB
SUB lose
CLS
LOCATE 5, 5: PRINT "You lose!"
END
END SUB
SUB win
CLS
LOCATE 5, 5: PRINT "You win!"
END
END SUB
别忘了,还有我
我来回复