原題:
描述
桌子上放着兩堆糖果,Matrix67和Shadow輪流對這些糖果進行操作。在每一次操作中,操作者需要喫掉其中一堆糖果,並且把另一堆糖果分成兩堆(可以不相等)留給對方操作。遊戲如此進行下去,糖果數會越來越少,最後必將出現這樣一種情況:某人喫掉一堆糖果後發現另一堆裏只剩一塊糖果不能再分了。遊戲規定此時該操作者喫掉最後這一塊糖果從而取勝。
這個遊戲是不公平的。對於任意一種初始狀態,總有一方有必勝策略。所謂有必勝策略是指,無論對方如何操作,自己總有辦法取勝。
Matrix67和Shadow將進行10次遊戲,每一次遊戲中總是Matrix67先進行操作。Matrix67想知道每一次遊戲中誰有必勝策略。
輸入格式
對於50%的數據,這些正整數均不超過100;
對於70%的數據,這些正整數均不超過10 000;
對於100%的數據,這些正整數均不超過10 000位。
輸出格式
請注意大小寫。
測試樣例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
解題思路
當你分的是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");
}
}