小甲鱼 发表于 2012-12-26 01:43:08

魔术师发牌问题

题目:编程求出扑克牌的排放顺序符合以下要求。

问题描述:

魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将13张牌全部翻出,准确无误。

视频讲解:http://blog.fishc.com/1982.html


源代码参考:http://bbs.fishc.com/thread-25387-1-1.html

发表于 2013-5-31 22:41:01

强烈支持楼主ing……

兢兢 发表于 2013-6-27 21:19:47

Dim a(13),b(13)
For i = 1 To 13
    b(i) = 1
Next
i=1
m = 1
n = 1
k = 14
While (k>1)
    If b(i) = 1 Then
      If n = m Then
            a(i) = m
            b(i) = 0
            m = m + 1
            k = k - 1
            n = 1
      Else
            n = n + 1
      End If
    End If
    i = i + 1
    If i = 14 Then
      i=1
    End If
Wend
For i = 1 To 13
    p = p & " " & a(i)
Next
MsgBox p,vbonly,"魔术师翻牌"

四季如春へ★ 发表于 2013-7-15 20:15:23

我来看看有十个字符吗

四季如春へ★ 发表于 2013-7-15 20:21:10

#include<iostream>
using namespace std;

int a,visit;

int main()
{
        memset(visit,0,sizeof(visit));
        int k=1,cnt=0;
        for(int i=1;i<=14&&k<14;i++)
        {
                if(i==14)
                        i=1;
                if(!visit)
                        cnt++;
                if(cnt==k)
                {
                        a=k;
                        visit=1;
                        k++;
                        cnt=0;
                }
        }
        for(int i=1;i<=13;i++)
                cout<<a<<" ";
        cout<<endl;
        return 0;
}
结果:1 8 2 5 10 3 12 11 9 4 7 6 13

大娱乐家_╮ 发表于 2013-7-24 13:04:06


强烈支持楼主ing……:(感恩无私的分享与奉献 :)

岁月如歌 发表于 2013-11-27 22:29:36

真是难得给力的帖子啊。

铭记太阳 发表于 2017-5-11 09:38:53

魔术师发牌用循环链表执行:

#include<stdio.h>
#include<stdlib.h>
#define NUM 13
struct Date
{
    int number;
    int flag;
    struct Date *next;
};

void ListInsert(struct Date **pt,int num,int fl)
{
    struct Date *tmp=NULL,*middle=NULL;
    tmp=(struct Date *)malloc(sizeof(struct Date));
    if(tmp==NULL)   exit(1);
    tmp->number = num;
    tmp->flag = fl;
    if((*pt)!=NULL)
    {       
        middle = *pt;
        *pt = tmp;
        tmp->next = middle;
    }
    else
    {
        tmp->next=NULL;
        (*pt)=tmp;
    }
//    printf("插入成功!\n");
}
void ClearList(struct Date **pt)
{
    struct Date *kill=NULL;
    for(int i=0; i<NUM-1;++i)
    {
        kill=(*pt);
        (*pt)=(*pt)->next;
        free(kill);       
    }
    free(*pt);
    printf("Clear OK!\n");

}

void ListPrint(struct Date *pt)
{
    if(pt->flag==0){
      while(pt!=NULL)
      {
          printf("%d--%d\n",pt->number,pt->flag);
          pt = pt->next;
      }
    }
    else{
        for(int i=1;i<=NUM;++i)
        {
          printf("No.%d is %d\n",i,pt->number);
          pt=pt->next;
        }
    }
    putchar('\n');
}
void ListCircle(struct Date **pt)
{
    struct Date *rear=*pt;
    while(rear->next!=NULL)
        rear=rear->next;
    rear->next=*pt;
}

void Magician(struct Date **pt)
{
    for(int i=1;i<=NUM;++i)
    {
        if(i==1)
        {
          (*pt)->number=1;
          (*pt)->flag=1;
          (*pt)=(*pt)->next;
        }
        else
        {
          for(int j=i-1;j>0;--j)
          {
                do{
                  (*pt)=(*pt)->next;
                }while((*pt)->flag==1);
          }
          (*pt)->number=i;
          (*pt)->flag=1;
          do{
                (*pt)=(*pt)->next;
          }while(((*pt)->flag==1)&&(i!=NUM));
        }
    }
}

int main()
{
    struct Date *pt=NULL;
    for(int i=NUM ;i>0;i--)
        ListInsert(&pt,0,0);
    ListPrint(pt);
    ListCircle(&pt);
    pt->flag=1;
    Magician(&pt);
    ListPrint(pt);
    ClearList(&pt);
    return 0;

}

212212081 发表于 2022-8-15 16:18:49

void        Magical(int n){
                int i=0,j=0;
                pNode CL_Head=0;pNode CL_Tail=0;
                CreateCListTail(&CL_Head,&CL_Tail,n);        //全部输入为0
                pNode sp=CL_Head;
               
                for(i=1;i<=n;i++){
                        while(j<i){
                                sp=sp->Next;j++;
                                if(sp->data!=0){
                                        j--;
                                }
                        }
                        j=0;sp->data=i;
                }
                PrintfCList(CL_Head);
}
页: [1]
查看完整版本: 魔术师发牌问题