鱼C论坛

 找回密码
 立即注册
查看: 8570|回复: 8

[技术交流] 魔术师发牌问题

[复制链接]
发表于 2012-12-26 01:43:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

问题描述:

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


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


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-31 22:41:01 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,"魔术师翻牌"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-15 20:15:23 | 显示全部楼层
我来看看有十个字符吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-15 20:21:10 | 显示全部楼层
#include<iostream>
using namespace std;

int a[14],visit[14];

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[i])
                        cnt++;
                if(cnt==k)
                {
                        a[i]=k;
                        visit[i]=1;
                        k++;
                        cnt=0;
                }
        }
        for(int i=1;i<=13;i++)
                cout<<a[i]<<" ";
        cout<<endl;
        return 0;
}
结果:1 8 2 5 10 3 12 11 9 4 7 6 13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-24 13:04:06 | 显示全部楼层

强烈支持楼主ing……:(感恩无私的分享与奉献 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-27 22:29:36 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表