主题:魔术牌问题,请各位解析,谢谢!
火狼
[专家分:80] 发布于 2005-08-18 15:10:00
[em18] 魔术师将一迭13张扑克面朝下,翻开第一张为A,将第一张放在桌子上,将后一张
放到这迭牌的最下面,翻开下一张是2,把2放在桌子上,然后依次数出2张放到最底面
下一张是3,……,最后一张是K,编程输出这迭牌原先顺序
program pai;
var
a:array[1..13] of integer;
m,n,t,i,j:integer;
begin
a[1]:=1;
for i:= 2 to 13 do a[i]:=0;
t:=0;
for i:= 2 to 13 do
begin
n:=0;
repeat
t:=t+1;
if t=14 then t:=1;
if a[t]=0 then n:=n+1
until n=i;
a[t]:=i;
end;
for j:= 1 to 13 do
write(a[j]:4);
end.
[em18][em18]
回复列表 (共5个回复)
沙发
口口and枕头 [专家分:1550] 发布于 2005-08-18 15:52:00
这个题目可以转化一下~仔细想想翻牌的过程不难发现.翻牌的过程可以看作,第一次翻第一张牌,第二次翻剩下的牌的第二张(就是现在的i),第三次翻剩下的牌的第三张.....这样就简单了很多..再来看代码就容易理解了
program pai;
var
a:array[1..13] of integer;
m,n,t,i,j:integer;
begin
a[1]:=1;//只要不是0就代表以经翻出去了的牌,以后就不对它作处理了.
for i:= 2 to 13 do a[i]:=0;//初使化后面还没有翻的牌
t:=0;
for i:= 2 to 13 do
begin
n:=0;//n是数的牌数
repeat
t:=t+1;
if t=14 then t:=1;//一共只有13张牌呀~数完了又倒回来数(不管牌怎么往后放,从左到右牌的顺序是不变的~所以不用考虑牌往后放的问题)
if a[t]=0 then n:=n+1//判断是否以经翻开,没翻就数牌
until n=i;//当数到i了
a[t]:=i;//写入现在翻开的是几
end;
for j:= 1 to 13 do
write(a[j]:4);
end.
板凳
口口and枕头 [专家分:1550] 发布于 2005-08-18 15:53:00
表忘了加分哟`~~~呵呵`~~
3 楼
口口and枕头 [专家分:1550] 发布于 2005-08-18 17:09:00
这个题和狐狸捉兔子问题,简化后就有点像~~~~
这是狐狸捉兔子问题的贴子看看吧~:
[url=http://www.programfan.com/club/showbbs.asp?id=98781]http://www.programfan.com/club/showbbs.asp?id=98781[/url]
4 楼
QQ331373582 [专家分:1500] 发布于 2005-08-19 09:57:00
var
s: array[1..13] of integer;
i, j, k, m: integer;
begin
for i := 1 to 13 do
s[i] := i;
j := 0; //M的累加
k := 0; //指针
m := 1; //每次抽出的牌数
while 13 - m >= 0 do
begin
if k > 13 then
k := 1
else
k := k + 1;
while s[k] = 0 do
begin
if k > 13 then
k := 1
else
k := k + 1;
end;
j := j + 1;
if j = m then
begin
s[k] := 0;
writeln(m, '->', k);
j := 0;
m := m + 1;
end;
end;
readln;
end.
5 楼
QQ331373582 [专家分:1500] 发布于 2005-08-19 09:57:00
加FEN
我来回复