请问对拍程序是什么?用C语言的话怎么实现?

请问对拍程序是什么?用C语言的话怎么实现?,第1张

对拍指的是用一个简单的程序去检测一个复杂的程序。

具体的方法就是:

1、随机生成n组数据。

2、用复杂的程序把数据跑一遍。(因为你要检查的就是这个程序,可能会有小漏洞,用这个可以检查出来)。

3、用简单的程序把数据跑一遍。(简单的程序不要错就行了)

4、对比两次的答案,如果不一样,你就要检查自己的程序了。

另一种简单的思路:

情侣的空间位置要求转换为

101 1001 10001 100001四个数各自左移,然后或运算得到11111111的要求。

#include <stdio.h>

#define LOVERS_PAIR_1    (0b101)

#define LOVERS_PAIR_2    (0b1001)

#define LOVERS_PAIR_3    (0b10001)

#define LOVERS_PAIR_4    (0b100001)

#define LOVERS_PAIR_TARGET   (0b11111111)

int main()

{

    int x=0, y=0, z=0, t=0

    unsigned char result=0

    char order[8+1]={'\0'}

    printf("符合:情侣Aa中间隔一个人,情侣Bb中间隔两个人,情侣Cc中间隔三个人,情侣Dd中间隔四个人的情况:\n")

    for(x=0,result=0 x<6 x++)//x表示情侣Aa组合从右到左需空出的位置

    {

        result = LOVERS_PAIR_1<<x

        for(y=0 y<5 y++)//y表示情侣Bb组合从右到左需空出的位置

        {

            if (result&(LOVERS_PAIR_2<<y))

                continue

            result = result|(LOVERS_PAIR_2<<y)

            for (z=0 z<4 z++)//z表示情侣Cc组合从右到左需空出的位置

            {

                if (result&(LOVERS_PAIR_3<<z))

                    continue

                result = result|(LOVERS_PAIR_3<<z)

                for(t=0 t<3 t++)//t表示情侣Dd组合从右到左需空出的位置

                {

                    if (result&(LOVERS_PAIR_4<<t))

                        continue

                    result = result|(LOVERS_PAIR_4<<t)

                    if (LOVERS_PAIR_TARGET==result)//找到了!转换后打印

                    {

                        order[8-x-1]='a'

                        order[8-(x+2)-1]='A'

                        order[8-y-1]='b'

                        order[8-(y+3)-1]='B'

                        order[8-z-1]='c'

                        order[8-(z+4)-1]='C'

                        order[8-t-1]='d'

                        order[8-(t+5)-1]='D'

                        order[8]='\0'

                        printf("%s\n", order)

                    }

                }

            }

        }

    }

}

程序输出:

符合:情侣Aa中间隔一个人,情侣Bb中间隔两个人,情侣Cc中间隔三个人,情侣Dd中间隔四个人的情况:

DACaBdcb

能拆一对是一对啊 -.-!

定义一个结构类型表示一张牌,结构包含3个成员,第一个成员char:取值2,3~K,A表示牌名字,第二个成员int:取值2~14表示牌真实大小。第三个成员:结构链表指针。

写一个初始化函数,定义52大小的结构数组,成员值初值分别和牌对应,遍历数组并将每个元素的链表指针依次指向下一个元素地址。这样得到一个初始链表。(相当于一盒新牌)

所有涉及随机数都用rand函数,洗牌分四份就是循环取随机数m=1~n,n是随循环自减,初值52,直到n变成0。每随一次循环就从初始链表中遍历取出对应第m个节点,并从初始链表中将这个节点断开(既前一个节点指针直接指向后一个节点指针)。每取13张就组成一个新的链表。这样获得4个新链表分别表示4个玩家。

最后出牌就是分别遍历自己的链表,利用循环取牌比较结构数值大小。(取出的牌要从链表断开和上面一样,你把取出节点写成独立函数就能反复使用)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8074624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存