具体的方法就是:
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个玩家。
最后出牌就是分别遍历自己的链表,利用循环取牌比较结构数值大小。(取出的牌要从链表断开和上面一样,你把取出节点写成独立函数就能反复使用)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)