蓝桥杯[省赛][B组]-全球变暖
作者:互联网
这题在当时的环境下不能使用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; }
标签:map,int,value,蓝桥,num,&&,省赛,变暖,1005 来源: https://www.cnblogs.com/MagicHaze/p/16103284.html