1. 程式人生 > >hdu1846巴什博弈(java)

hdu1846巴什博弈(java)

題目連結
有一堆石子一共有 n 個,兩人輪流進行,每走一步可以取走 1…m 個石子,最先取光石子的一方為勝。
對於博弈的理解,就是圍繞找必勝點和必敗點而解決問題,首先分析m
1:m>=n先走必贏
2:m+1=n先走必輸,因為只能拿1-m個,那麼剩下的一定可以直接拿完
3:m+1>n時候,換位思考,如果我是第二拿,我只想剩m+1一定能贏,如果我是先拿,我想讓我成為可選擇的第二狀態,所以先取者就想取到剩(m+1)的倍數為止,因為剩下m+1倍數,無論第二個人怎麼拿,第一個人總能拿完,總剩下m-1的倍數,所以是必勝態。但是這也不是絕對的,因為都選擇最優策略,所以一旦剛開始就是m+1的倍數,那麼先拿的人就涼了。狀態就轉移了。
附上程式碼,暑假寫的題目,順便複習一下

/*
 * 巴士博弈
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class hdu1846 {

	public static void main(String[] args) throws IOException {
		StreamTokenizer in=
new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); int k=(int)in.nval; for(int i=0;i<k;i++) { in.nextToken();int n=(int)in.nval; in.nextToken();int m=(int)in.nval; if(n%
(m+1)!=0) {out.println("first");} else out.println("second"); out.flush(); } } }