题目描述:

  古代某个狱卒某天闲着没事想和两个罪犯玩个游戏,他找了个国际象棋盘,每个格子放上一个硬币,硬币长得都一样,正反都是狱卒自己决定。

  之后他只让A罪犯观看棋盘,并随便指一个硬币告诉A罪犯,只要B罪犯能选出这个硬币就释放A和B,之后A被允许选一个硬币翻面,然后A被带走了。接着B被带过来并被要求选一个硬币,如果他选到狱卒指的那个硬币就GE,反之GG。

  A和B只能在游戏开始前进行策略交流,游戏中无法交流,在被带到棋盘前时他们也完全不知道棋盘上的硬币正反如何。

  问:那么A和B怎么做才能有最大几率被释放呢?

前几天在朋友空间看到的题目,感觉挺有意思就拿过来分享讨论一下。

然而只给出了答案并没有解释答案的思路,答案见下。

(1)首先将棋盘分成下面6种样子(每个格子里面放着一枚硬币正反随意,并且编号为下图所示):

          

(2)然后在给号的棋盘上,对应着数数 。蓝色区域内的硬币个数为奇数时得到1,为偶数时得到0。这样我们就得到了一个六位数(每一张图都可以对应得到一个数字0或者1)上面六张图的顺序是从高位到低位。(A罪犯在观察棋盘的时候要做的首要工作就是将这个六位数按照上面的方式找出来)

(3)然后狱卒随心选择一个格子(这个格子里的硬币就是B罪犯需要翻转的,但是B罪犯并不知道),但是A罪犯知道是这个格子,也知道这个格子的编号(编号从0~63 )。每个格子都有唯一对应的一个六位二进制数,因为最大为111111正好为63 ,最小值为000000正好为0。(A罪犯接下来需要做的就是把狱卒所选格子的编号转化为一个六位的二进制数)

(4)A罪犯最后要求翻转一枚硬币来帮助同伴(B罪犯)找到狱卒所指的硬币。在前面A罪犯首先得到了一个六位数,也得到了狱卒选择格子对应的六位二进制数。最关键的一步:A罪犯需要将这两个数进行异或(相同得0,不同得1),得到了第三个六位二进制数。接下来A罪犯需要将这第三个六位二进制数转为十进制数。这个十进制数就是A罪犯要翻转的格子编号。

(5)A罪犯被带走了,B罪犯被带了过来。现在B罪犯面对着棋盘需要找到狱卒之前所选的硬币,好像无从下手啊。不过A罪犯是程序员给了B罪犯提示。只要按照上面六张图所示的找到现在棋盘对应的一个六位二进制数,然后把它转化为十进制数,这个十进制数就是我要翻转的格子的编号。

给一个棋盘的界面:


参考代码:

#include <bits/stdc++.h>

using namespace std ;
int main()
{
int a[][] ;
srand(time(NULL)) ;
memset( a , ,sizeof ( a ) ) ;
for( int i = ; i < ; i ++ )
{
for( int j = ; j < ; j ++ )
{
a[i][j] = rand()%2 ;
}
}
cout<<"初始化界面为: \n"<<endl ;
for( int i = ; i < ; i ++ )
{
for( int j = ; j < ; j ++ )
{
cout<<a[i][j]<<" " ;
}
cout<<endl ;
}
cout<<"- - - - - - - - - - - - - - - -\n"<<endl ;
cout<<"原始六位数为: " ;
int num[] ;
int bit0[] ;
memset( num , 0 , sizeof ( num ) ) ;
memset( bit0 , 0 , sizeof ( bit0 ) ) ;
int temp0[]={ 1 , 3 , 5 , 7 } ;
int temp1[]={ 2 , 3 , 6 , 7 } ;
int temp2[]={ 4 , 5 , 6 , 7 } ;
for( int i = ; i < ; i ++ )
{
for( int j = ; j < ;j ++ )
{
if( a[temp0[i]][j] == 0 )
num[]++ ;
if( a[temp1[i]][j] == )
num[]++ ;
if( a[temp2[i]][j] == )
num[]++ ;
if( a[j][temp0[i]] == )
num[]++ ;
if( a[j][temp1[i]] == )
num[]++ ;
if( a[j][temp2[i]] == )
num[]++ ;
}
}
for( int i = ; i < ; i ++ )
{
if( num[i]% == )
bit0[i] = 0 ;
else
bit0[i] = 1 ;
}
for( int i = ; i >= ; i -- )
cout<<bit0[i];
cout<<endl ;
int bitnum = 0 ;
for( int i = ; i < ; i ++ )
{
int temp = bit0[i]*pow(,i) ;
bitnum += temp ;
}
cout<<"对应十进制数为: "<<bitnum<<endl<<"\n";
int row , col ;
row = rand() % 8 ;
col = rand() % 8 ;
cout<<"轮到狱卒选择 :"<<endl ;
cout<<"所选行为 "<<row<<" 所选列为"<<col<<endl<<"\n" ;
int choose = * row + col;
cout<<"狱卒选择的硬币编号为: "<<choose<<endl<<"\n" ;
int c1 = bitnum^choose ;
cout<<"A罪犯得到的原始十进制数 异或 狱卒所选硬币的编号 得到: "<<c1<<endl<<"\n" ;
int row1 = c1/8 ;
int col1 = c1%8 ;
cout<<"A罪犯应给为B罪犯翻转的硬币所在位置为:";
cout<<"行为:"<<row1<<" 列为:"<<col1<<endl<<"\n" ;
if( a[row1][col1] == 1 )
a[row1][col1] = 0 ;
else
a[row1][col1] = 1 ;
for( int i = ; i < ; i ++ )
{
for( int j = ; j < ; j ++ )
{
cout<<a[i][j]<<" " ;
}
cout<<endl ;
}
cout<<"- - - - - - - - - - - - - - - -\n"<<endl ;
int bit1[] ;
memset( bit1 , 0 , sizeof ( 6 ) ) ;
memset( num , 0 , sizeof ( num ) ) ;
for( int i = ; i < ; i ++ )
{
for( int j = ; j < ;j ++ )
{
if( a[temp0[i]][j] == 0 )
num[]++ ;
if( a[temp1[i]][j] == 0 )
num[]++ ;
if( a[temp2[i]][j] == 0 )
num[]++ ;
if( a[j][temp0[i]] == )
num[]++ ;
if( a[j][temp1[i]] == )
num[]++ ;
if( a[j][temp2[i]] == )
num[]++ ;
}
}
cout<<"B罪犯得到的六位二进制数为: " ;
for( int i = ; i < ; i ++ )
{
if( num[i]% == )
bit1[i] = 0 ;
else
bit1[i] = 1 ;
}
for( int i = ; i >= ; i -- )
cout<<bit1[i] ;
cout<<endl ;
int bitnum1 = 0 ;
for( int i = ;i < ; i ++ )
{
int temp = bit1[i] * pow ( 2 , i ) ;
bitnum1 += temp ;
}
cout<<"B罪犯反转的硬币为: "<<bitnum1<<endl ;
}

GCC运行结果:

求解释该方法的思路。O(∩_∩)O~

转载请注明出处:www.cnblogs.com/zpfbuaa

Strange Problem O(∩_∩)O~的更多相关文章

  1. Codeforces Round #429 (Div. 2/Div. 1) [ A/_. Generous Kefa ] [ B/_. Godsend ] [ C/A. Leha and Function ] [ D/B. Leha and another game about graph ] [ E/C. On the Bench ] [ _/D. Destiny ]

    PROBLEM A/_ - Generous Kefa 题 OvO http://codeforces.com/contest/841/problem/A cf 841a 解 只要不存在某个字母,它的 ...

  2. GGS-DDU HDU - 4966

    GGS-DDU Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  3. *HDU3496 背包DP

    Watch The Movie Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  4. 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告

    一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...

  5. Watch The Movie

    Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Tot ...

  6. HDU 3496 Watch The Movie(看电影)

    HDU 3496 Watch The Movie(看电影) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] New sem ...

  7. C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Team Foundation\4.0\Cache\VersionControl.config is not valid and cannot be loaded.

    Recently, we experienced a strange problem with TFS 2010. We spent a few days before we figured it o ...

  8. Ubuntu 13.10 PHP 5.5.x mcrypt missing – Fatal Error: Undefined function mcrypt_encrypt()!

    [原文]http://www.tuicool.com/articles/goto?id=myM7veR I had updgraded my Ubuntu from 13.04 to 13.10 la ...

  9. TOJ3596 二维背包

    3596.   Watch The Movie Time Limit: 2.0 Seconds   Memory Limit: 65536KTotal Runs: 424   Accepted Run ...

随机推荐

  1. C#中协变与抗变(逆变)

    泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Do ...

  2. T-SQL 查询出某个列总值大于X的数据

    原文: https://www.lesg.cn/netdaima/sqlservert-sql/2016-459.html 今天操作查询的时候遇见一个这样的要求: 有一张表 用户ID 购买日期 购买金 ...

  3. C#单纯的字母数字ASCII码转换

    字母转换成数字 byte[] array = new byte[1];   //定义一组数组array            array = System.Text.Encoding.ASCII.Ge ...

  4. iOS 阶段学习第九天笔记(内存管理)

    iOS学习(C语言)知识点整理 一.内存管理 1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>:在堆里面申请内存,si ...

  5. 炉石传说 C# 开发笔记

    最近在大连的同事强力推荐我玩 炉石传说,一个卡牌游戏.加上五一放一个很长很长的假期,为了磨练自己,决定尝试开发一个C#的炉石传说. 这件事情有人已经干过了,开发了一个网页版的炉石,但是貌似不能玩... ...

  6. 为sql server 增加 parseJSON 和 ToJSON 函数

    在SqlServer中增加Json处理的方法 Sql Server 存储非结构话数据可以使用xml类型,使用xpath方式查询,以前写过一篇随笔:Sql Server xml 类型字段的增删改查 除了 ...

  7. Windows Server 2012 配置多用户远程桌面

    前段时间因为需要多用户同时远程连接 windows server 2012,但找了半天也没找到远程桌面管理,最后从搜索中找到如下方法,经测试可行! 打开注册表,进入路径: [HKEY_LOCAL_MA ...

  8. BaseActivity的抽取

    Activity有些公共部分,比如setContentView.Activity管理.初始化操作.联网操作.Activity跳转.关闭当前Activity.保存用户登录信息.读取用户登录信息等. 我们 ...

  9. MAC使用CocoaPods

    前言,還是那句話,按照濤叔下面畫黃色的步驟順序執行就好了 使用CocoaPods兩種方式:使用之前安裝的插件&命令行. 一.利用插件 1.創建項目后添加CocoaPods 2.在文本框中輸入如 ...

  10. tomcat jdk servlet websocket版本对应关系

    最近在考虑公司主要基础三方库版本统一和升级的问题,特看了下tomcat jdk servlet websocket版本的对应关系,如下: