题目大意:
Conan在一旁玩着2048。
这是一个4*4的矩阵,初始全为0。
每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
给N次操作,N次后,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵。否则输出“Game over!”
题解:
就是一道纯模拟:
注意一下:
①不能连环变,
向左滑,则2 2 4 8,
只能变成4 4 8 0,
而不是16 0 0 0
②N次做完后,如果4*4的矩阵满了,则判断一下上下左右分别滑动后的情况,有一种情况可以出现空各自都不算Game over!
③过程中可能已经无法继续
时间复杂度:O(N*16)
var
c,a:array [0..5,0..5] of longint;
rp:Array [1..4] of boolean;
g,x,y,v,i,j,n:longint;
q:boolean;
f:char;
procedure work1;
var
i,j,k:longint;
begin
for i:=1 to 4 do
begin
k:=0;
for j:=1 to 4 do
if a[i,j]<>0 then
begin
inc(k);
a[i,k]:=a[i,j];
if k<>j then a[i,j]:=0;
end;
end;
for i:=1 to 4 do
for j:=1 to 3 do
if a[i,j]<>0 then
if a[i,j]=a[i,j+1]
then begin
a[i,j]:=a[i,j]+a[i,j+1];
a[i,j+1]:=0;
end;
for i:=1 to 4 do
begin
k:=0;
for j:=1 to 4 do
if a[i,j]<>0 then
begin
inc(k);
a[i,k]:=a[i,j];
if k<>j then a[i,j]:=0;
end;
end;
end;
procedure work2;
var
i,j,k:longint;
begin
for i:=1 to 4 do
begin
k:=5;
for j:=4 downto 1 do
if a[i,j]<>0 then
begin
dec(k);
a[i,k]:=a[i,j];
if k<>j then a[i,j]:=0;
end;
end;
for i:=1 to 4 do
for j:=4 downto 2 do
if a[i,j]<>0 then
if a[i,j]=a[i,j-1]
then begin
a[i,j]:=a[i,j]+a[i,j-1];
a[i,j-1]:=0;
end;
for i:=1 to 4 do
begin
k:=5;
for j:=4 downto 1 do
if a[i,j]<>0 then
begin
dec(k);
a[i,k]:=a[i,j];
if k<>j then a[i,j]:=0;
end;
end;
end;
procedure work3;
var
i,j,k:longint;
begin
for i:=1 to 4 do
begin
k:=0;
for j:=1 to 4 do
if a[j,i]<>0 then
begin
inc(k);
a[k,i]:=a[j,i];
if k<>j then a[j,i]:=0;
end;
end;
for i:=1 to 4 do
for j:=1 to 3 do
if a[j,i]<>0 then
if a[j,i]=a[j+1,i]
then begin
a[j,i]:=a[j,i]+a[j+1,i];
a[j+1,i]:=0;
end;
for i:=1 to 4 do
begin
k:=0;
for j:=1 to 4 do
if a[j,i]<>0 then
begin
inc(k);
a[k,i]:=a[j,i];
if k<>j then a[j,i]:=0;
end;
end;
end;
procedure work4;
var
i,j,k:longint;
begin
for i:=1 to 4 do
begin
k:=5;
for j:=4 downto 1 do
if a[j,i]<>0 then
begin
dec(k);
a[k,i]:=a[j,i];
if k<>j then a[j,i]:=0;
end;
end;
for i:=1 to 4 do
for j:=4 downto 2 do
if a[j,i]<>0 then
if a[j,i]=a[j-1,i]
then begin
a[j,i]:=a[j,i]+a[j-1,i];
a[j-1,i]:=0;
end;
for i:=1 to 4 do
begin
k:=5;
for j:=4 downto 1 do
if a[j,i]<>0 then
begin
dec(k);
a[k,i]:=a[j,i];
if k<>j then a[j,i]:=0;
end;
end;
end;
function check():boolean;
var
i,j:longint;
d:boolean;
begin
d:=false;
for i:=1 to 4 do
for j:=1 to 4 do
if a[i,j]=0 then d:=true;
exit(d);
end;
begin
readln(n);
for g:=1 to n do
begin
readln(x,y,v,f,f);
if a[x,y]<>0 then
begin
writeln('Game over!');
halt;
end;
a[x,y]:=v;
case f of
'L':work1;
'R':work2;
'U':work3;
'D':work4;
end;
q:=false;
for i:=1 to 4 do
for j:=1 to 4 do
if a[i,j]=0 then q:=true;
if (not(q)) and (g<>n) then
begin
writeln('Game over!');
halt;
end;
end;
c:=a;
work1; rp[1]:=check(); a:=c;
work2; rp[2]:=check(); a:=c;
work3; rp[3]:=check(); a:=c;
work4; rp[4]:=check(); a:=c;
if (rp[1]) or (rp[2]) or (rp[3]) or (rp[4])
then begin end
else begin
writeln('Game over!');
halt;
end;
for i:=1 to 4 do
begin
for j:=1 to 3 do write(a[i,j],' '); write(a[i,4]);
writeln;
end;
end.