蓝桥杯[省赛][B组]-全球变暖
2022-04-05 18:22 幻霞 阅读(60) 评论(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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架