藍橋杯[省賽][B組]-全球變暖
2022-04-05 18:22 幻霞 閱讀(67) 評論(0) 收藏 舉報
這題在當時的環境下不能使用c++11標準,因此一些寫法會有編譯錯誤和警告.
題目的思路還是很明確的,可以先深度搜索得到島上所有點,把它們記錄在map中對應一個值,然后遍歷二維數組
標記淹沒點,在下一輪遍歷中數組和map去掉對應點,最后看還有哪些島還沒被完全淹沒
#include<bits/stdc++.h> #include<map> using namespace std; char num[1005][1005]= {0}; int n; map<pair<int,int>,int> value; int island=0; int f[1000]= {0}; int dx[4]= {1,-1,0,0}; int dy[4]= {0,0,1,-1}; // 判斷邊界 bool ijok(int i,int j) { return (i>=0 && i<n && j>=0 && j<n); } // 深度搜索得到整個島嶼包含的點 void dfs(int i,int j,int k) { if(ijok(i,j)) { if(num[i][j]=='#') { if(value.find(make_pair(i,j))!=value.end()) { return; } else { value[make_pair(i,j)]=k; } } else { return; } } else { return; } dfs(i+1,j,k); dfs(i-1,j,k); dfs(i,j+1,k); dfs(i,j-1,k); } int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>n; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cin>>num[i][j]; } } // 計算相連的島嶼 for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(num[i][j]=='#' && value.find(make_pair(i,j))==value.end()) { dfs(i,j,++island); } } } // 標記要被淹沒的地區 for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(num[i][j]=='#') { for(int m=0; m<4; m++) { // 這一階段不能把陸地換成海洋,不然會導致全部變成海洋 if(ijok(i+dx[m],j+dy[m]) && num[i+dx[m]][j+dy[m]]=='.') { num[i][j]='a'; break; } } } } } // 淹沒計算并在表中移除對應地塊 for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(num[i][j]=='a') { num[i][j]='.'; value.erase(make_pair(i,j)); } } } // 標記還存在的陸地 for(map<pair<int,int>,int>::iterator it=value.begin(); it!=value.end(); it++) { f[it->second]=1; } int left=0;//計算剩下的陸地數量 for(int i=1; i<=island; i++) { left+=f[i]; } cout<<island-left; return 0; }
浙公網安備 33010602011771號