程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva_10404-Bachets Game

uva_10404-Bachets Game

編輯:C++入門知識

[cpp] 
/**博弈題。。這種題目的特點就是——想到方法後很簡單,想不到
 *就做不出了。。開始想窮舉法列出所有結果,後來發現數據量太大
 *行不通,後來看了看博弈相關東西,突然靈光一閃,想到只考慮當前
 *步,把總數為1~count時先手的輸贏標記起來,方程為:
 *  if(i-a[i] == 0 || !num[i-a[i]](i-a[i]>0)) 先手贏
 *就是剛好一次可以移動完,或者移動一次後,對手必輸
 */ 
#include <cstdio> 
#include <cstring> 
using namespace std; 
 
#define MAX 12 
#define MAXC 121 
 
int a[MAX]; 
int num[MAXC]; 
 
 
void move_stones(int count, int type){ 
    for(int i = 1; i <= count; i ++){ 
        for(int j = 0; j < type; j ++){ 
            if( i - a[j] > 0 && !num[i-a[j]] ){ 
                num[i] = 1; 
                break; 
            }else if( i - a[j] == 0 ){ 
                num[i] = 1; 
                break; 
            } 
        } 
    } 
    if( num[count] ) 
        printf("Stan wins\n"); 
    else 
        printf("Ollie wins\n"); 

 
int main(int argc, char const *argv[]) 

#ifndef ONLINE_JUDGE 
        freopen("test.in", "r", stdin); 
#endif 
    int count, type; 
    while( ~scanf("%d", &count) ){ 
        memset(num, 0, sizeof(num)); 
        scanf("%d", &type); 
        for(int i = 0; i < type; i ++) 
            scanf("%d", &a[i]); 
        move_stones(count, type); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved