hdu1846巴什博弈(java)
阿新 • • 發佈:2018-11-12
題目連結
有一堆石子一共有 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();
}
}
}