[Ybt] [例示的な基本計算の広範な検索例2]山と谷

山の山と谷

トピックリンク:山と谷


タイトル説明

ここに画像の説明を挿入
ここに画像の説明を挿入

問題解決のアイデア

幅広い検索テンプレートの質問。

8つの接続があることに注意してください。

低いだけ、それから山

高いだけ、それから谷

周囲が高い場合と低い場合、それは山でも谷でもありません。

高低がなければ、山でも谷です。

コード

#include<iostream>
#include<cstdio>
using namespace std;

const int xn[9]={
    
    0,0,1,0,-1,1,1,-1,-1};
const int yn[9]={
    
    0,1,0,-1,0,1,-1,1,-1};

int n,sf,sg,ts;
int xx[10000000];
int yy[10000000];
int a[1010][1010];
int v[1010][1010];

void bfs(int sx,int sy)
{
    
    
	int hd=0,tl=1;
	int f=0,g=0;
	xx[1]=sx,yy[1]=sy;
	while(hd<tl)
	{
    
    
		hd++;
		for(int i=1;i<=8;i++)
		{
    
    
			int x=xx[hd]+xn[i];
			int y=yy[hd]+yn[i];
			if(x<1||x>n||y<1||y>n)
				continue;
			if(a[x][y]==a[xx[hd]][yy[hd]]&&!v[x][y])
			{
    
    
				tl++;
				xx[tl]=x;
				yy[tl]=y;
				v[x][y]=1;
			}
			{
    
    
				if(a[x][y]>a[xx[hd]][yy[hd]])
					g=1;
				if(a[x][y]<a[xx[hd]][yy[hd]])
					f=1;
			}
		}
	}
	if(g==1&&f==0)
		sg++;
	if(g==0&&f==1)
		sf++;
}

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(!v[i][j])
			{
    
    
				v[i][j]=1;
				bfs(i,j);
				ts++;
			}
	if(ts==1)
		cout<<1<<" "<<1<<endl;
	else
		cout<<sf<<" "<<sg<<endl;
}

おすすめ

転載: blog.csdn.net/SSL_guyixin/article/details/112131884