回 帖 发 新 帖 刷新版面

主题:魔术牌问题,请各位解析,谢谢!

[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个回复)

沙发

这个题目可以转化一下~仔细想想翻牌的过程不难发现.翻牌的过程可以看作,第一次翻第一张牌,第二次翻剩下的牌的第二张(就是现在的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.

板凳

表忘了加分哟`~~~呵呵`~~

3 楼

这个题和狐狸捉兔子问题,简化后就有点像~~~~
这是狐狸捉兔子问题的贴子看看吧~:
[url=http://www.programfan.com/club/showbbs.asp?id=98781]http://www.programfan.com/club/showbbs.asp?id=98781[/url]

4 楼

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 楼

加FEN

我来回复

您尚未登录,请登录后再回复。点此登录或注册