?? 石子游戲.cpp
字號:
/*
題目 - 石子游戲
描述
現有4堆石子,兩個人輪流取石子,他們有n種可能的取法,取法表示從第1堆取A1個石子,從第2堆中取B1個,第3堆取C1個,第4堆取D1個.如果取的時候某一堆的石子數比所要取的石子數要少,則這種取法是不可行的.取到最后沒有可行取法的人就算輸了.
現給出4堆石子的石子數目以及n種取法,請問如果兩個人都采用最優取法,先取的人是贏還是輸.
關于輸入
第一行是4個數,表示每堆石子的數目(石子數目小于等于30).
第二行是一個正整數n(n<=10),表示取法種數
接下來n行,每行4個數,表示這種取法會在每一堆石子中取多少個
關于輸出
如果先手可以取勝,輸出"win",否則輸出"lose"
例子輸入
5 5 5 5
3
1 1 1 1
1 0 1 0
0 1 0 1
例子輸出
win
*/
#include<iostream>
using namespace std;
int n,w[11][4],temp[31][31][31][31];
int judge(int a,int b,int c,int d)
{
if(a < 0 || b < 0 || c < 0 || d < 0)
return 1;
if(temp[a][b][c][d]==-1)
{
int count=0;
for(int i=0;i<n;i++)
count+=judge(a-w[i][0],b-w[i][1],c-w[i][2],d-w[i][3]);
if(count!=n)
temp[a][b][c][d]=1;
else
temp[a][b][c][d]=0;
}
return temp[a][b][c][d];
}
int main()
{
int a,b,c,d,i,j,k,t;
for(i=0;i<31;i++)
for(j=0;j<31;j++)
for(k=0;k<31;k++)
for(t=0;t<31;t++)
temp[i][j][k][t]=-1;
cin>>a>>b>>c>>d>>n;
for(i=0;i<n;i++)
cin>>w[i][0]>>w[i][1]>>w[i][2]>>w[i][3];
if(judge(a,b,c,d))
cout<<"win"<<endl;
else
cout<<"lose"<<endl;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -