#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& vis,int x,int y)
{
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(!vis[xx][yy]&&grid[xx][yy]==1){
vis[xx][yy]=1;
dfs(grid,vis,xx,yy);
}
}
}
signed main()
{
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m,0)) ;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> grid[i][j];
}
}
vector<vector<bool>> vis(n,vector<bool>(m,false));
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]==1&&!vis[i][j]){
vis[i][j]==1;
res++;
dfs(grid,vis,i,j);
}
}
}
cout << res;
return 0;
}
// 版本二
#include <iostream>
#include <vector>
using namespace std;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水
visited[x][y] = true; // 标记访问过
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过
dfs(grid, visited, nextx, nexty);
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>> visited(n, vector<bool>(m, false));
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (!visited[i][j] && grid[i][j] == 1) {
result++; // 遇到没访问过的陆地,+1
dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true
}
}
}
cout << result << endl;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt;
int res=0;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& vis,int x,int y)
{
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(!vis[xx][yy]&&grid[xx][yy]==1){
vis[xx][yy]=1;
cnt++;
dfs(grid,vis,xx,yy);
}
}
}
signed main()
{
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> grid[i][j];
}
}
vector<vector<bool>> vis(n,vector<bool>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]&&grid[i][j]==1){
vis[i][j]=1;
cnt=1;
dfs(grid,vis,i,j);
res=max(res,cnt);
}
}
}
cout << res;
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt;
int res=0;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& vis,int x,int y)
{
if(vis[x][y]||grid[x][y]==0) return;
vis[x][y]=1;
cnt++;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
dfs(grid,vis,xx,yy);
}
}
signed main()
{
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> grid[i][j];
}
}
vector<vector<bool>> vis(n,vector<bool>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]&&grid[i][j]==1){
cnt=0;
dfs(grid,vis,i,j);
res=max(res,cnt);
}
}
}
cout << res;
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt;
int res=0;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(vector<vector<int>>& grid,int x,int y)
{
grid[x][y]=0;
cnt++;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(grid[xx][yy]==0) continue;
dfs(grid,xx,yy);
}
}
signed main()
{
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> grid[i][j];
}
}
for(int i=0;i<n;i++){
if(grid[i][0]==1) dfs(grid,i,0);
if(grid[i][m-1]==1) dfs(grid,i,m-1);
}
for (int j = 0; j < m; j++) {
if (grid[0][j] == 1) dfs(grid, 0, j);
if (grid[n - 1][j] == 1) dfs(grid, n - 1, j);
}
cnt=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1){
dfs(grid, i, j);
}
}
}
cout << cnt;
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt;
int res=0;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& vis,int x,int y)
{
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(grid[xx][yy]==0) continue;
if(vis[xx][yy]==1) continue;
dfs(grid,vis,xx,yy);
}
}
signed main()
{
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> grid[i][j];
}
}
vector<vector<bool>> vis(n,vector<bool>(m));
for(int i=0;i<n;i++){
if(grid[i][0]==1) dfs(grid,vis,i,0);
if(grid[i][m-1]==1) dfs(grid,vis,i,m-1);
}
for (int j = 0; j < m; j++) {
if (grid[0][j] == 1) dfs(grid,vis, 0, j);
if (grid[n - 1][j] == 1) dfs(grid,vis, n - 1, j);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1&&!vis[i][j]){
grid[i][j]=0;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout<<grid[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
蓝桥账户中心全球变暖问题
一定要记住,如果要改地图的话,千万不要改成和原来地图一样的,要换一个符号和之前做区分
像这道题的海洋。就比如这道题改成‘,’
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1010;
char grid[N][N];
bool vis[N][N];
int n;
int res=0; // 初始岛屿数量
int dx[]={0,1,0,-1}, dy[]={-1,0,1,0};
// 检查一个陆地像素是否会被淹没,并标记
void ddfs(int x, int y) {
for (int i = 0; i < 4; i++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx < 0 || xx >= n || yy < 0 || yy >= n) continue;
if (grid[xx][yy] == '.') {
grid[x][y] = ','; // 如果相邻有海洋,标记为‘,’,与之前做区分千万不能标记成'.'
break;
}
}
}
// 深度优先搜索,用于统计岛屿数量
void dfs(int x, int y) {
for (int i = 0; i < 4; i++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx < 0 || xx >= n || yy < 0 || yy >= n) continue;
if (vis[xx][yy] || grid[xx][yy] == '.') continue;
vis[xx][yy] = 1;
dfs(xx, yy);
}
}
signed main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> grid[i][j];
}
}
// 第一次 DFS:统计初始的岛屿数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '#' && !vis[i][j]) {
vis[i][j] = 1;
res++;
dfs(i, j);
}
}
}
// 重置访问标记
memset(vis, 0, sizeof(vis));
// 模拟淹没过程
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '#') {
ddfs(i, j);
}
}
}
// 第二次 DFS:统计淹没后的岛屿数量
int res2 = 0; // 淹没后的岛屿数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '#' && !vis[i][j]) {
vis[i][j] = 1;
res2++;
dfs(i, j);
}
}
}
// 输出完全被淹没的岛屿数量
cout << res - res2 << endl;
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=110;
bool vis[N][N];
int a[N][N];
int n,m;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
void dfs(int x,int y)
{
if(vis[x][y]) return;
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(a[x][y]<a[xx][yy]) continue;
dfs(xx,yy);
}
}
bool isres(int x,int y)
{
memset(vis,0,sizeof vis);
dfs(x,y);
bool is1=0;
bool is2=0;
for(int i=0;i<n;i++){
if(vis[i][m-1]){
is1=1;
break;
}
}
for(int i=0;i<n;i++){
if(vis[i][0]){
is2=1;
break;
}
}
for(int j=0;j<m;j++){
if(vis[0][j]){
is2=1;
break;
}
}
for(int j=0;j<m;j++){
if(vis[n-1][j]){
is1=1;
break;
}
}
if(is1&&is2) return 1;
return 0;
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin >> n >> m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(isres(i,j)){
cout << i << ' ' << j << endl;
}
}
}
return 0;
}