题解(类似深搜(?不过没有递归
2026-04-24 19:12:02
发布于:江苏
18阅读
0回复
0点赞
先上代码(能过)(底下有详细过程)
#include <bits/stdc++.h>
using namespace std;
int mp[105][105];
int n,m;
int s=0;
int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,-1,-1,1,-1};
bool bl(int x,int y){
for(int i=0;i<8;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&mp[nx][ny]<mp[x][y]){
return false;
}
}
return true;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(bl(i,j)==true){
s++;
}
}
}
cout<<s;
return 0;
}
下面是详细过程
说时候当时考级的时候想的是深搜,写完才发现没有递归,因为想的是深搜,所以可以先写出如下代码框架:
#include <bits/stdc++.h>
using namespace std;
int mp[105][105];//储存数组,用于储存高度
int n,m;//长宽
int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,-1,-1,1,-1};//方向数组
/*
用来和坐标进行加减,存进去的数组如下:
{1,0}{0,1}{-1,0}{0,-1}{1,1}{-1,1}{-1,-1}{1,-1}
以第一组为例:
在mp数组中坐标为[1][1],其中行加上dir[1][0],列加上dir[1][1],则可以访问mp[2][1]的数据
*/
int main(){
//输入长宽、高度
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
return 0;
}
然后根据图得知,边缘也可以作为“山谷”,因此从i=1,j=1开始遍历:
#include <bits/stdc++.h>
using namespace std;
int mp[105][105];
int n,m;
int s=0;
int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,-1,-1,1,-1};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
//遍历每一个数
}
}
return 0;
}
因为实际上这个“深搜函数”是一个判断函数,所以当时我写到最后发现好像用bool类型比较好使
bool bl(int x,int y){
for(int i=0;i<8;i++){//遍历8个方向,因为dir数组是直接定义的,所以下标从0开始,需要从0开始遍历
int nx=x+dir[i][0];//新的x坐标
int ny=y+dir[i][1];//新的y坐标
if(nx>=1&&nx<=n/*x坐标是否超出边界*/&&ny>=1&&ny<=m/*y坐标是否超出边界*/&&mp[nx][ny]<mp[x][y]/*新坐标的高度是
否小于原先传入的x,y坐标的高度*/){
return false;//如果不超边界且小于原先传入的x,y坐标的高度,则不是山谷,输出false
}
}
return true;//如果并没有在循环内结束,证明在与之相邻的8个山地中是最低的,属于山谷
}
最后加上计数和输出
#include <bits/stdc++.h>
using namespace std;
int mp[105][105];
int n,m;
int s=0;//计数变量
int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,-1,-1,1,-1};
bool bl(int x,int y){
for(int i=0;i<8;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&mp[nx][ny]<mp[x][y]){
return false;
}
}
return true;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(bl(i,j)==true){
s++;//如果是山谷,则加1
}
}
}
cout<<s;//输出总数
return 0;
}
这里空空如也






有帮助,赞一个