消除方块程序
Elimination of blocks program
今天早上我参加了一个技术讨论,主席邀请我和他一起玩一个游戏。
有"n"块的序列,每个玩家都有机会选择2个相邻的块,并将它们标记为已填满。玩家们继续这样做,直到最后一对相邻的方块被填满。填满最后一对的人输掉游戏。
问题:后来有人问我是否可以用c++编写一个程序,在每次机会时向每个玩家提供提示,以确定考虑到当前棋盘的状态,可用的对子中哪一对会给他最大的获胜机会。
我肯定有一个设计/算法。只是我无法识别它。你能给我一个解决这个问题的可能方法吗?是否存在涵盖类似问题(如分区问题)的既定问题
我认为我们可以使用动态规划。让:
dp[n, 1] = true if player 1 has a certain winning strategy for n blocks
false otherwise
dp[n, 2] = same for player 2
玩家1先移动。
我们:dp[0, 1] = dp[0, 2] = true
dp[1, 1] = dp[1, 2] = true
dp[2, 1] = false, dp[2, 2] = true
然后递归考虑当前玩家拿走了第一个和第二个块,第二个和第三个等等。这意味着对手必须处理两堆大小的牌:
0, n - 2
1, n - 3
2, n - 4
...
k, n - k - 2, k = 0 to n - 2
对于一个玩家来说,他们必须至少有一个获胜策略。
对于当前玩家来说,他必须能够将对手带到他们的dp
是false
的状态。我们输入:
dp[n, 1] = OR {NOT (dp[k, 2] OR dp[n - k - 2, 2])}
0 <= k <= n - 2
dp[n, 2] = OR {NOT (dp[k, 1] OR dp[n - k - 2, 1])}
0 <= k <= n - 2
意味着dp[n, 1]
是真的,如果我们可以让下一个玩家进入一个他没有确定的获胜策略的状态。当然,我们的对手也会打出最佳状态。
dp[k, 2] OR dp[n - k - 2, 2]
如果玩家2对两摞牌都有获胜策略,则返回true。如果是,我们不想选择它,所以我们将它取反,返回false。如果不是,通过否定它我们得到真,通过对所有值进行OR
,我们发现是否有一个真,我们可以选择。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 消除方块程序