取球博弈--蓝桥杯
歡迎訪問我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1366789560.html
簡述
這是2012年藍(lán)橋杯全國軟件大賽預(yù)賽(C++本科組)第10題,實(shí)質(zhì)是已知球的數(shù)量,規(guī)定取球方法,判斷先取球的人的輸贏。
推薦鏈接:《2012藍(lán)橋杯軟件大賽預(yù)賽題目匯總》
題目描述
??? 今盒子里有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,并且兩人都很聰明,不會做出錯誤的判斷。
??? 我們約定:
??? 每個人從盒子中取出的球的數(shù)目必須是:1,3,7或者8個。
??? 輪到某一方取球時不能棄權(quán)!
??? A先取球,然后雙方交替取球,直到取完。
??? 被迫拿到最后一個球的一方為負(fù)方(輸方)
??? 請編程確定出在雙方都不判斷失誤的情況下,對于特定的初始球數(shù),A是否能贏?
??? 程序運(yùn)行時,從標(biāo)準(zhǔn)輸入獲得數(shù)據(jù),其格式如下:
??? 先是一個整數(shù)n(n<100),表示接下來有n個整數(shù)。然后是n個整數(shù),每個占一行(整數(shù)<10000),表示初始球數(shù)。
??? 程序則輸出n行,表示A的輸贏情況(輸為0,贏為1)。
??? 例如,用戶輸入:
4
1
2
10
18
??? 則程序應(yīng)該輸出:
0
1
1
0
??? 注意:
??? 請仔細(xì)調(diào)試!您的程序只有能運(yùn)行出正確結(jié)果的時候才有機(jī)會得分!
??? 在評卷時使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的。
??? 請把所有函數(shù)寫在同一個文件中,調(diào)試好后,存入與【考生文件夾】下對應(yīng)題號的“解答.txt”中即可。
??? 相關(guān)的工程文件不要拷入。
??? 源代碼中不能能使用諸如繪圖、Win32API、中斷調(diào)用、硬件操作或與操作系統(tǒng)相關(guān)的API。
??? 允許使用STL類庫,但不能使用MFC或ATL等非ANSI c++標(biāo)準(zhǔn)的類庫。例如,不能使用CString類型(屬于MFC類庫)。
分析
這是2012年藍(lán)橋杯全國軟件大賽預(yù)賽第10題,也就是最后一題,沒涉及數(shù)據(jù)結(jié)構(gòu)和算法,重點(diǎn)在問題的分析上。完成這個題目要理解一下幾點(diǎn):
下面程序把前10000個球的所有狀態(tài)都計(jì)算出來了,其實(shí)可以把輸入的最大數(shù)以前的所有狀態(tài)求出即可。
源代碼
# include <stdio.h> # define MAX 10000 # define MAXIN 100 int result[MAX] = {0, 0, 1, 0, 1, 0, 1, 0, 1, 1}; void getresult(void); int main(void) {int i;int n;int in[MAXIN];getresult();scanf("%d", &n);for(i = 0; i < n; i++) {scanf("%d", &in[i]);}for(i = 0; i < n; i++) {printf("%d\n", result[in[i]]);} } void getresult(void) {int i;for(i = 9; i < 10000; i++) {result[i] = 0;if(result[i - 1] == 0) {result[i] = 1;} else if(result[i - 3] == 0) {result[i] = 1;} else if(result[i - 7] == 0) {result[i] = 1;} else if(result[i - 8] == 0) {result[i] = 1;}} }轉(zhuǎn)載于:https://www.cnblogs.com/milkcu/archive/2013/04/24/3808935.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
- 上一篇: 手机号码换了微信怎么办?
- 下一篇: SCI2012年收录的中文期刊