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