PAT B10.68百万本の緑の茂みが少し赤(20ポイント)

ここに画像の説明を挿入
この質問には多くの落とし穴があります。まず、必要なピクセルだけが表示される必要があることに注意してください。マップを使用して、各入力ピクセルが表示される回数を記録できます。次に、側面の円のピクセルも判断する必要があります(タイトルには、周囲に8ピクセルがあることが明確に示されています。側面の円はカウントされないと思います)、ピクセル配列の行と列を次のように増やすことができます。 1、それを-tol -1に割り当てて達成します(詳細についてはコードを参照してください)。

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;

int m, n, tol;
int MIN = -tol-1;

int gap(int a, int b){
    
    
	return abs(a-b);
}

int main(){
    
    
	map<int,int> time;
	scanf("%d %d %d", &m, &n, &tol);
	
	int arr[n+2][m+2];
	fill(arr[0], arr[0]+(n+2)*(m+2), MIN);
	int num = 0;
	int row, col, res;
	bool flag[n+1][m+1] = {
    
    false};
	for(int i=1; i<=n; i++){
    
    
		for(int j=1; j<=m; j++){
    
    
			scanf("%d", &arr[i][j]);
			time[arr[i][j]]++;
		}
	}
	
	int t, t1, t2, t3, t4, t5, t6, t7, t8;
	for(int i=1; i<=n; i++){
    
    
		for(int j=1; j<=m; j++){
    
    
			t = arr[i][j];
			t1 = arr[i-1][j-1];
			t2 = arr[i-1][j];
			t3 = arr[i-1][j+1];
			t4 = arr[i][j+1];
			t5 = arr[i+1][j+1];
			t6 = arr[i+1][j];
			t7 = arr[i+1][j-1];
			t8 = arr[i][j-1];
			if(gap(t,t1)>tol && gap(t,t2)>tol && gap(t,t2)>tol && gap(t,t3)>tol && gap(t,t4)>tol && gap(t,t5)>tol && gap(t,t6)>tol && gap(t,t7)>tol && gap(t,t8)>tol){
    
    
				flag[i][j] = true;
			}
		}
	}
	for(int i=1; i<=n; i++){
    
    
		for(int j=1; j<=m; j++){
    
    
			if(flag[i][j]){
    
    
				if(time[arr[i][j]] == 1){
    
    
					num++;
					row = i;
					col = j;
					res = arr[i][j];
				}
			}
		}
	}
	if(num == 0){
    
    
		printf("Not Exist");
	}else if(num > 1){
    
    
		printf("Not Unique");
	}else{
    
    
		printf("(%d, %d): %d", col, row, res);
	}
	
	return 0;
} 

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/113852129