算法求解:一个翻牌的小游戏(30分)

  • 主题发起人 主题发起人 Delphi刘
  • 开始时间 开始时间
D

Delphi刘

Unregistered / Unconfirmed
GUEST, unregistred user!
有24张牌 如下*排列
* * * *
* * * * *
* * * * *
* * * * *
* * * * *
规则:每张牌只能翻一次,下一张只能是刚翻那张的上下左右其中的一张牌
要求:每张牌都翻过来
例:我翻了第一张牌,这张牌就不能再翻,下一张要翻的牌只能是第一排第二张或第二排第一张。
 
我也想知道,以前考虑过但没思路
 
搞一个矩阵存牌是否被翻过,如翻过置1
在艘索山下左右就好办了吧
b[j]
b[i+1][j]
b[i-1][j]
……
 
这题本质上就是求哈密顿回路。换个出法就好理解了,从某一点出发,每个点都经过且仅经过一次。此题规模不大,用深度优先就可以。
 
leechange肯定知道,呵呵,但他不想回答,
 
to 大大翁:
呵呵,老大您什么时候被放出来啦?
不是我不想答,而是当时快下班了,我现在就开始写程序。
 
此题无解,有诗为证:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
Move: array [1..4, 1..2] of Integer = ((-1, 0), (0, 1), (1, 0), (0, -1));
type
TMaze = array [1..5, 1..5] of Boolean;
TNode = record
Maze: TMaze;
x, y: Integer;
d: Integer
end;

var
Stack: array [1..24] of TNode;
Top: Integer;
i, j: Integer;
x, y: Integer;
procedure Print;
var
a: array [1..5, 1..5] of Integer;
i, j: Integer;
begin
FillChar(a, SizeOf(a), 0);
for i:=1 to Topdo
a[Stack.x, Stack.y]:=i;
for i:=1 to 5do
begin
for j:=1 to 5do
Write(a[i, j]:3);
WriteLn
end;
ReadLn;
Halt
end;

begin
for i:=1 to 5do
for j:=1 to 5do
if (i<>1) or (j<>4) then
begin
Top:=1;
FillChar(Stack[Top].Maze, SizeOf(TMaze), 0);
Stack[Top].Maze[1, 4]:=True;
Stack[Top].Maze[i, j]:=True;
Stack[Top].x:=i;
Stack[Top].y:=j;
Stack[Top].d:=0;
while Top>0do
begin
while Stack[Top].d<4do
begin
Inc(Stack[Top].d);
x:=Stack[Top].x+Move[Stack[Top].d, 1];
y:=Stack[Top].y+Move[Stack[Top].d, 2];
if (x in [1..5]) and (y in [1..5]) and (not Stack[Top].Maze[x, y]) then
begin
Inc(Top);
Stack[Top]:=Stack[Top-1];
Stack[Top].x:=x;
Stack[Top].y:=y;
Stack[Top].Maze[x, y]:=True;
Stack[Top].d:=0;
if Top=24 then
Print
end
end;
Dec(Top)
end
end;
WriteLn('Fault!');
ReadLn
end.
 
接受答案了.
 
后退
顶部