日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

环上的游戏

發(fā)布時(shí)間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 环上的游戏 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

環(huán)上的游戲(cycle)
有一個(gè)取數(shù)的游戲。初始時(shí),給出一個(gè)環(huán),環(huán)上的每條邊上都有一個(gè)非負(fù)整數(shù)。這些整數(shù)中至少有一個(gè)0。然后,將一枚硬幣放在環(huán)上的一個(gè)節(jié)點(diǎn)上。兩個(gè)玩家就是以這個(gè)放硬幣的節(jié)點(diǎn)為起點(diǎn)開(kāi)始這個(gè)游戲,兩人輪流取數(shù),取數(shù)的規(guī)則如下:
(1)選擇硬幣左邊或者右邊的一條邊,并且邊上的數(shù)非0;
(2)將這條邊上的數(shù)減至任意一個(gè)非負(fù)整數(shù)(至少要有所減小);
(3)將硬幣移至邊的另一端。
如果輪到一個(gè)玩家走,這時(shí)硬幣左右兩邊的邊上的數(shù)值都是0,那么這個(gè)玩家就輸了。
如下圖,描述的是Alice和Bob兩人的對(duì)弈過(guò)程,其中黑色節(jié)點(diǎn)表示硬幣所在節(jié)點(diǎn)。結(jié)果圖(d)中,輪到Bob走時(shí),硬幣兩邊的邊上都是0,所以Alcie獲勝。

?


現(xiàn)在,你的任務(wù)就是根據(jù)給出的環(huán)、邊上的數(shù)值以及起點(diǎn)(硬幣所在位置),判斷先走方是否有必勝的策略。
【輸入格式】
第一行一個(gè)整數(shù)N(N≤20),表示環(huán)上的節(jié)點(diǎn)數(shù)。
第二行N個(gè)數(shù),數(shù)值不超過(guò)30,依次表示N條邊上的數(shù)值。硬幣的起始位置在第一條邊與最后一條邊之間的節(jié)點(diǎn)上。
【輸出格式】
僅一行。若存在必勝策略,則輸出“YES”,否則輸出“NO”。
【樣例】
cycle1.in
4
2 5 3 0
cycle1.out
YES

cycle2.in
3
0 0 0
cycle2.out
NO

最后取到數(shù)的人獲勝

解:首先根據(jù)題意分析可得假使走過(guò)一條邊那么每次將它一點(diǎn)點(diǎn)減小到0

和一次性將它減小到0是一樣的,那么不妨每走過(guò)一條邊,就將邊上的數(shù)值

減為0;

數(shù)據(jù)范圍n<=20

那么我們可以搜索所有的可行路線,

(相當(dāng)于剪枝)一旦存在先手贏的做法,就返回

?

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 using namespace std; 8 int n,a[30]; 9 int L(int x) 10 { 11 int p=(x-1+n)%n; 12 if(p==0) p=n; 13 return p; 14 } 15 int R(int x) 16 { 17 int p=(x+1+n)%n; 18 if(p==0) p=n; 19 return p; 20 } 21 bool fg; 22 //1 Alice 2 Bob 23 void dfs(int nw,int peo) 24 { 25 // cout<<"uu "<<nw<<" "<<peo<<endl; 26 if(fg) return; 27 if(a[nw]==0 && a[L(nw)]==0) 28 { 29 if(peo==2) fg=1; 30 return; 31 } 32 if(a[nw]) 33 { 34 int tmp=a[nw];a[nw]=0; 35 dfs(R(nw),3-peo); 36 a[nw]=tmp; 37 } 38 if(a[L(nw)]) 39 { 40 int tmp=a[L(nw)];a[L(nw)]=0; 41 dfs(L(nw),3-peo); 42 a[L(nw)]=tmp; 43 } 44 } 45 int main() 46 { 47 freopen("cycle.in","r",stdin); 48 freopen("cycle.out","w",stdout); 49 scanf("%d",&n); 50 for(int i=1;i<=n;++i) scanf("%d",&a[i]); 51 dfs(1,1); 52 // for(int i=1;i<=n;++i) 53 // cout<<i<<" PPP "<<L(i)<<" "<<R(i)<<endl; 54 if(fg) printf("YES"); 55 else printf("NO"); 56 return 0; 57 }//數(shù)據(jù)范圍小,搜索 代碼

?

轉(zhuǎn)載于:https://www.cnblogs.com/adelalove/p/9096908.html

總結(jié)

以上是生活随笔為你收集整理的环上的游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。