7 条题解
-
1
先阅读题目:题目出现两个变量N,M,还有一个char类型的沙盘a,另外还有一个答案(山的数量)ans。 因为是深搜题,还需要三个变量:vis,dx,dx,vis由于记录点是否被访问,dx和dy用于深搜时x,y方向的增减。
int n,m,ans; char a[105][105]; bool vis[105][105]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1};
接下来编主函数 首先要按题目要求输入n,m,a
cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } }
(至于为啥不把dfs放输入里,自己试试看就知道了) 接下来遍历一遍a,找出一座山(一定要是没被访问过的山)并把它标记为被访问过就可以进深搜函数了(这里先不讲深搜)把一座山深搜完,应增加ans,表示发现了一座山。
for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(a[i][j]=='#'&&vis[i][j]==false){ vis[i][j]=true; dfs(i,j); ans++; } } }
好了,现在还有输出,题目要求输出山的数量就是输出ans
cout<<ans;
这样子主函数就差不多了 主函数:
int main(){ 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(a[i][j]=='#'&&vis[i][j]==false){ vis[i][j]=true; dfs(i,j); ans++; } } } cout<<ans; return 0; }
接下来是深搜(我喜欢用void,这个根据个人喜好决定,不同的当然要作相应修改),定义x,y作当前节点的坐标 首先,因为没有终点,所以不写if和return,深搜完就直接退出,先写一个for,用来搜索四面的节点,这里要临时定义xx=dx[i]+x,yy=dy[i]+y,用来保存四面节点,然后判断节点是否满足以下四个条件: 1.不出界; 2.没有被标记; 3.是山; 满足了就可以从xx,yy继续深搜(注意vis)。 这样dfs就编完了,注意要把它放在主函数前。
void dfs(int x,int y){ for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&vis[xx][yy]==false&&a[xx][yy]=='#'){ vis[xx][yy]=true; dfs(xx,yy); } } }
样例代码:
#include<bits/stdc++.h> using namespace std; int n,m,ans; char a[105][105]; bool vis[105][105]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; void dfs(int x,int y){ for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&vis[xx][yy]==false&&a[xx][yy]=='#'){ vis[xx][yy]=true; dfs(xx,yy); } } } int main(){ 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(a[i][j]=='#'&&vis[i][j]==false){ vis[i][j]=true; dfs(i,j); ans++; } } } cout<<ans; return 0; }
第一次写题解QwQ求大佬给意见,求支持QwQ
信息
- ID
- 2744
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 58
- 已通过
- 24
- 上传者