竞赛游戏 & 亦或应用!!!

来源:互联网 发布:小牛数据恢复破解版 编辑:程序博客网 时间:2024/04/29 03:39

首先我想说明一下亦或这个应用,我认为亦或是一个非常重要的知识点。

总结一下亦或的性质 :

1.a ^ a = 0;

2.a ^ 0 = a;

3.(a ^ b) ^ c = a ^ (b ^ c);

4.已知 a ^ b = c 得到 a = b ^ c;


 这些性质对于我们来求解某些问题非常的重要。

问题1:

交换两个变量的数值,但是不能引用第三个变量。

方法一:

a = a + b;

b = a - b;

a = a - b;

方法二:

a = a ^ b;

b = a ^ b;

a = a ^ b;


问题2:

连续给你1~1001个数字,但是有一个数字是重复的,问如何得到这个数字。

直接把这1 ~ 1001       这些数字都亦或,之后再从 1 ~ 1000  亦或,就能得到结果。


问题3:

一个数组中数字出现的个数是偶数的,但是有一个数字出现的个数是奇数的,如果知道这个数字。

把这个数组中的所有数进行亦或,就能得到出现奇数个数的那个数字


问题4:

在一个数组中,数字都是成对出现的,也就是说这对数字都彼此相等,但是有一对数字出现不是符合这个规定的,这对数字彼此是不相等的,求出这对不相等的数字。。。

把这个数组中的所有数进行亦或,得到的是这两个数字的的亦或结果,之后把这个亦或的结果看成是二进制,之后找到不为0的位,只要找到一个就可以了,找到后,让这个位置一直是1,其他的位变成0,之后和这个数组进行亦或,最后就能得到一对数字中其中的一个,剩下的那个和两个数的亦或结果在亦或就可以了。。。


竞赛游戏 :

这是一道博弈论的问题,A B 这两个人,在n堆石子中的一堆中拿出若干石子。直到不能再拿出石子的人为输。。。


这个题目首先要理解博弈论中的必胜态和必败态问题,我查询了博弈树的相关知识,也看了一些视频,只能大概理解为所谓的比生态或者为必败态就是如果对方一定能赢,你就一定会输,前提这个游戏只有两个人加入,如果你能确定他一定会输,那你就一定能赢,反正就是不是他赢就是你赢,就只用这两种结果。。


如果有20个石子,你和你的小伙伴一起进行拿石子,但是你们拿走的个数只能为 1 3 7 9 ,若果出现不能拿的情况就认为这个人输了,不能弃权。。。


对于这个题目就是使用了博弈的思想。他把每一种情况都考虑进去,就想好是一颗树一样,这样我们就自然而然的使用了递归的思想。

#include<string.h>#include<stdlib.h>#include<stdio.h>#include<iostream>using namespace std;#defineTRUE1#defineFALSE0int buf[] = {1,3,7,8};int fun(int num){for(int i = 0;i < 4;i++){if(num >= buf[i]){if(!fun(num-buf[i])){//如果对手输,我一定会赢                    return TRUE;}}}return FALSE;//无论怎样对手都赢,我必输}int main( void ){(fun(20) && printf("我会赢\n")) || printf("我会输\n");return 0;}

现在该说我的那道竞赛游戏了,知道知道必败态和必胜态还有亦或之后,我们就能解决这个题目了。。。

思想就是如果这n堆石子都相同,先手A必败,如果不是B必败

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>using namespace std;int main( void ){int num;int arr;int sum;while(scanf("%d",&num) != EOF){sum = 0;for(int i = 0;i < num;i++){scanf("%d",&arr);sum ^= arr;}sum && printf("A赢\n") || printf("B赢\n");}return 0;}


0 0