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

本文介绍亦或运算的基本性质及其在交换变量、查找重复及奇数次元素等问题的应用,并通过具体示例讲解如何利用亦或运算解决复杂的数据处理挑战。此外,还探讨了博弈论中的必胜态和必败态概念,以及如何将亦或运算应用于博弈游戏中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

总结一下亦或的性质 :

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;
#define		TRUE	1
#define		FALSE	0
int 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值