1. 程式人生 > >牛客練習賽31

牛客練習賽31

c代碼 color oid mat 部落 upload 例子 cout dir

A.地、顏色、魔法

題目描述

現在,你作為一名新星鵬洛客,找到了一塊絕佳的修煉地。這塊地方可以被描述成一個 n x m 的矩形。你已經在這塊地中的一些位置打好了標記。接下去,就該對整塊地賦予你的顏色了。一個位置能被賦予你的顏色,當且僅當滿足以下條件之一:
1. 這個位置被打上了標記。
2. 這個位置在不經過被打標記的位置的情況下與邊界不連通(這個圖是四聯通的)。換句話說,如果你從這個位置開始,在不經過被打標記的位置,且只能向上下左右四個方向移動的情況下永遠不能走到地圖的邊界,那麽這個位置符合條件。
現在,你的好基友想知道,你能為多少個位置賦予你自己的顏色呢?

輸入描述:

第一行包含兩個正整數 n, m ,表示地圖的長和寬。
接下去 n 行,每行一個長為 m 的字符串,表示地圖的一行。
其中 ‘.‘表示該位置未被打標記;‘#‘表示該位置被打了標記。保證地圖僅由‘.‘和‘#‘構成。

輸出描述:

輸出僅一行,包含一個整數,表示你的答案。
示例1

輸入

4 4
....
.###
.#.#
.###

輸出

9

說明

可以被賦予顏色的位置在下圖中用 技術分享圖片 標出了。 技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

備註:

1 ≤ n x m ≤ 10^6.
解題思路:
AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=1e6+5;
 5 int n,m,step;bool vis[maxn];
 6 vector<string> vec;string str;
 7 int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
 8 void dfs(int a,int b){
 9     if
(a<0||b<0||a>=n||b>=m||vis[a*m+b]||vec[a][b]==#)return; 10 vis[a*m+b]=true,step++,vec[a][b]=#; 11 for(int i=0;i<4;++i)dfs(a+dir[i][0],b+dir[i][1]); 12 } 13 int main(){ 14 while(cin>>n>>m){ 15 vec.clear(),step=0;memset(vis,false,sizeof(vis)); 16 for(int i=0;i<n;++i)cin>>str,vec.push_back(str); 17 for(int j=0;j<m;++j){ 18 if(vec[0][j]==.)dfs(0,j); 19 if(vec[n-1][j]==.)dfs(n-1,j); 20 } 21 for(int i=1;i<n-1;++i){ 22 if(vec[i][0]==.)dfs(i,0); 23 if(vec[i][m-1]==.)dfs(i,m-1); 24 } 25 cout<<n*m-step<<endl; 26 } 27 return 0; 28 }

B.贊迪卡之聲妮莎與奧劄奇

題目描述

奧劄奇軍團降臨!贊迪卡陷入危機!無盡輪回鎢拉莫和真理屠夫寇基雷帶領著這群龐大的掠食者在贊迪卡肆意破壞。旅法師妮莎瑞文必須要阻止這一切。 在贊迪卡時空的一角,有 n 個寇族的部落。為了抵禦奧劄奇的進攻,這些部落之間聯系密切。在任意兩個部落之間都有一條直接道路相連接。換句話說,這 n 個部落與若幹條道路構成了一張完全圖。 現在,奧劄奇軍團已經占領了 1 號寇族部落並停留在此處。而鎢拉莫與寇基雷兩王卻開始了遊戲(伊莫庫大姐快來管管)。遊戲的規則是這樣的:鎢拉莫與寇基雷兩王輪流帶領奧劄奇軍團移動一次。每次可以從一個寇族部落通過一條未被腐蝕的道路移動到另一個寇族部落。任何移動必須在這 n 個寇族部落及其道路中進行。由於奧劄奇對法術力的吞噬,奧劄奇軍團行經的道路都會被腐蝕。最後,在規則的限制下,奧劄奇軍團將無路可走。此時,將帶領軍團進行下一步移動的奧劄奇之王將輸掉這個遊戲。鎢拉莫先手。 鎢拉莫與寇基雷作為奧劄奇三祖中的兩者,自然擁有超高的智力。所以你可以認為,他們都將以最優決策進行遊戲。 遊戲的贏家將率領軍隊與妮莎作戰,而妮莎還在趕來的路上。所以請你先觀察這個遊戲,到時便可以告訴妮莎誰會是她的對手。

輸入描述:

本題有多組測試數據。
第一行一個正整數 T ,表示數據組數。
接下去 T 行,每行一個數 n ,表示寇族部落的個數。

輸出描述:

輸出共 T 行,每行一個字符串 "Ulamog, the Infinite Gyre" 或 "Kozilek, Butcher of Truth" 表示勝利者(去掉括號)。前者為無盡輪回鎢拉莫,後者為真理屠夫寇基雷。
示例1

輸入

2
1
3

輸出

Kozilek, Butcher of Truth
Ulamog, the Infinite Gyre

說明

- 當 n=3 時,鎢拉莫可以率領軍團從 1 走到 2 ,之後 技術分享圖片 的邊不能再走了。 - 下一步寇基雷只能帶領軍團移動至 3 ,之後 技術分享圖片 的邊不能再走了。 - 最後鎢拉莫只要將軍團移回 1 ,寇基雷就無路可走了。

備註:

1 ≤ T ≤ 2000
1 ≤ n ≤ 2000
解題思路:
AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int T,n;
 4 int main(){
 5     while(cin>>T){
 6         while(T--){
 7             cin>>n;
 8             if(n==1)cout<<"Kozilek, Butcher of Truth"<<endl;
 9             else cout<<"Ulamog, the Infinite Gyre"<<endl;
10         }
11     }
12     return 0;
13 }

牛客練習賽31