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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2017上海金马五校赛 丢史蒂芬妮 博弈问题

發(fā)布時間:2023/12/3 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017上海金马五校赛 丢史蒂芬妮 博弈问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

丟史蒂芬妮

發(fā)布時間: 2017年7月9日 18:17?? 最后更新: 2017年7月9日 21:05?? 時間限制: 1000ms?? 內(nèi)存限制: 128M

描述

有一天,空和白很無聊,決定玩盛大游戲,考慮到兩個人玩,他們隨便掏了一個游戲出來:在一個n*m的棋盤上,首先把史蒂芬妮·多拉放在左上角(1,1)的位置。每次一個人可以將她往下,往右,往右下丟一格。當(dāng)前回合,誰不能丟史蒂芬妮,誰就輸了。(注意,不可以把活人丟出棋盤啦!)游戲總是空先手。

白說,這是一個垃圾游戲!我們每次把史蒂芬妮丟素數(shù)個位置吧!(換句話說,每次丟2357或…格)空答應(yīng)了。

我們都知道,空和白都很聰明,不管哪方存在一個可以必勝的最優(yōu)策略,都會按照最優(yōu)策略保證勝利。

玩了一局,空已經(jīng)知道了這個游戲的套路,現(xiàn)在他決定考考你,對于給定的nm,空是贏是輸?如果空必勝,輸出“Sora”(無引號);反之,輸出“Shiro”(無引號)。

輸入

第一行有一個T表示數(shù)組組數(shù),1<= T < 100000
從第二行開始,每行為棋盤大小,nm分別表示行列。
1=< n <= 5001=< m <= 500

輸出

對于每組數(shù)據(jù),按題目要求輸出。

樣例輸入1 4 1 1 2 2 10 10 30 30 樣例輸出1 Shiro Shiro Shiro Sora

題解:我們可以看出這是一個Grundy博弈問題

每個局面(當(dāng)前所處的位置)代表一個狀態(tài)。這個狀態(tài)如果不是必勝態(tài),那么就是必敗態(tài)。

且滿足,從必敗態(tài)出發(fā),一定有方法轉(zhuǎn)移到必勝態(tài)。并且從必勝態(tài)出發(fā),不論怎樣走,都將轉(zhuǎn)變?yōu)楸財B(tài)。

這就是一個求grundy數(shù)的問題了

我們定義局面(i,j)的grundy數(shù)為grundy[i][j],并且設(shè)prime[k]是可行的素數(shù)步數(shù)。

那么,從這個局面可以轉(zhuǎn)移到(i-prime[k],j)或者(i,j - prime[k])或者(i-prime[k],j - prime[k])

所以求grundy數(shù)的函數(shù)就可以寫成這樣:

for(int i = 1;i <= 500;i++){for(int j = 1;j <= 500;j++){//set<int> st;memset(st,0,sizeof(st));for(int k = 0;k < cnt;k++){int step = prime[k];if(step < i) st[grundy[i - step][j]]++;if(step < j) st[grundy[i][j - step]]++;if(step < i && step < j) st[grundy[i - step][j - step]] ++ ;}int g = 0;while(st[g] != 0) {g++;}//cout<<g<<endl;grundy[i][j] = g;}//cout<<i<<endl;}AC代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <set> using namespace std; const int MAX = 505; int prime[MAX]; int grundy[MAX][MAX]; int cnt = 0; int n,m; int st[100]; void init(){for(int i = 2;i <= 500;i++){int f = 1;for(int j = 2;j*j <= i;j++){if(i%j == 0){f = 0;break;}}if(f){prime[cnt++] = i;}}//for(int i = 1;i <= 500;i++){for(int j = 1;j <= 500;j++){//set<int> st;memset(st,0,sizeof(st));for(int k = 0;k < cnt;k++){int step = prime[k];if(step < i) st[grundy[i - step][j]]++;if(step < j) st[grundy[i][j - step]]++;if(step < i && step < j) st[grundy[i - step][j - step]] ++ ;}int g = 0;while(st[g] != 0) {g++;}//cout<<g<<endl;grundy[i][j] = g;}//cout<<i<<endl;}} int main(){init();int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);puts((grundy[n][m] == 0) ? "Shiro" : "Sora");}return 0; }




總結(jié)

以上是生活随笔為你收集整理的2017上海金马五校赛 丢史蒂芬妮 博弈问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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