P1567 喫糖果遊戲

原題:

描述

    Matrix67和Shadow正在做一個小遊戲。
    桌子上放着兩堆糖果,Matrix67和Shadow輪流對這些糖果進行操作。在每一次操作中,操作者需要喫掉其中一堆糖果,並且把另一堆糖果分成兩堆(可以不相等)留給對方操作。遊戲如此進行下去,糖果數會越來越少,最後必將出現這樣一種情況:某人喫掉一堆糖果後發現另一堆裏只剩一塊糖果不能再分了。遊戲規定此時該操作者喫掉最後這一塊糖果從而取勝。
    這個遊戲是不公平的。對於任意一種初始狀態,總有一方有必勝策略。所謂有必勝策略是指,無論對方如何操作,自己總有辦法取勝。
    Matrix67和Shadow將進行10次遊戲,每一次遊戲中總是Matrix67先進行操作。Matrix67想知道每一次遊戲中誰有必勝策略。

輸入格式

    輸入數據一共10行,每行有兩個用空格隔開的正整數,表示一次遊戲開始時桌子上兩堆糖果分別有多少個。
    對於50%的數據,這些正整數均不超過100;
    對於70%的數據,這些正整數均不超過10 000;
    對於100%的數據,這些正整數均不超過10 000位。

輸出格式

    輸出十行字符串。這些字符串只能是“Matrix67”或“Shadow”,它們表示對應的十行輸入數據中有必勝策略的一方。
    請注意大小寫。

測試樣例1

輸入

1 1 
1 2 
1 3 
1 4 
1 5 
2 1 
2 2 
2 3 
2 4 
2 5

輸出

Matrix67 
Matrix67 
Matrix67 
Matrix67 
Matrix67 
Matrix67 
Shadow 
Shadow 
Matrix67 
Matrix67
一部分的解題思路:

標籤: 

解題思路

當你要分的那一組是2,3時,必敗,因爲你必須分出個1。
當你分的是7,8時,也必敗,因爲
7=2+5或者3+4 8=2+6或者3+5或者4+4,這時對方下一步就能分給你2或者3,所以必敗。
設a=[2,3,7,8]
設b=[1,4,5,6,9,10]
如果兩個數都可寫爲10i+a的形式,設喫掉了第一個數,留下的第二個數10i+a,這時你無論怎麼分,分出來的兩個數一定有一個屬於10i+b的形式。
而我們發現每個b都能寫成兩個a的形式。
1=3+8 4=2+2 5=2+3 6=3+3 9=2+7 10=2+8
因此如果兩個數都是10i+a的形式,經過一輪之後回到手裏的還是10i+a,所以必敗。
但如果兩個數中有一個數不是10i+a,這時可以把另外一個喫掉,然後把這個數分成兩個10i+a,這時對方必敗。
因此得出結論:如果兩個數的末尾都屬於a,Matrix67必敗,否則Matrix67勝。
//====================================================挺起的分割線
一開始覺得很難 寫個爆搜 輸出20內的數據
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
(2代表比贏 1代表必輸) 認真看 答案很清楚了 -_-  好像有點騙分的性質呀
轉自:喫糖果遊戲

這屬於博弈論的知識,通過例子與找規律,並且從1開始去分析,從中的答案去推出相應的規律。一下是有種方法解題:其中一個找到對5取餘數,餘數爲2/3的就必輸,太刁了。

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
		
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			int a=scanner.nextInt();
			int b=scanner.nextInt();
			new Main().solve(a, b);
			
		}
	}
	//方法一
	public void solve(int a,int b){
		int[] as=new int[]{2,3,7,8};
		int[] bs=new int[]{1,4,5,6,9,10};
		int modA=a%10;
		int modB=b%10;
		int i=0;
		for(i=0;i<bs.length;i++){
			if(bs[i]==modA||bs[i]==modB){
				System.out.println("Matrix67");
				break;
			}
		}
		if(i==bs.length)
			System.out.println("Shadow");
	}
	//方法二:會發現a/b處於5的時候,餘數爲2/3的時候,shadow贏
	public void solve2(int a,int b){
		
		if(a%5==2||a%5==3||b%5==2||b%5==3)
			System.out.println("Shadow");
		else
			System.out.println("Matrix67");
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章