PAT-B 1068 萬綠叢中一點紅【對映+陣列】

Enjoy_process發表於2019-02-25

                                           PAT-B 1068 萬綠叢中一點紅

                  https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184

 

 

題目

對於計算機而言,顏色不過是畫素點對應的一個 24 位的數值。現給定一幅解析度為 M×N 的畫,要求你找出萬綠叢中的一點紅,即有獨一無二顏色的那個畫素點,並且該點的顏色與其周圍 8 個相鄰畫素的顏色差充分大。

輸入

輸入第一行給出三個正整數,分別是 M 和 N(≤ 1000),即影象的解析度;以及 TOL,是所求畫素點與相鄰點的顏色差閾值,色差超過 TOL 的點才被考慮。隨後 N 行,每行給出 M 個畫素的顏色值,範圍在 [0,2​24​​) 內。所有同行數字間用空格或 TAB 分開。

輸出

在一行中按照 (x, y): color 的格式輸出所求畫素點的位置以及顏色值,其中位置 x 和 y 分別是該畫素在影象矩陣中的列、行編號(從 1 開始編號)。如果這樣的點不唯一,則輸出 Not Unique;如果這樣的點不存在,則輸出 Not Exist

樣例輸入

8 6 200
0 	 0 	  0 	   0	    0 	     0 	      0        0
65280 	 65280    65280    16711479 65280    65280    65280    65280
16711479 65280    65280    65280    16711680 65280    65280    65280
65280 	 65280    65280    65280    65280    65280    165280   165280
65280 	 65280 	  16777015 65280    65280    165280   65480    165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

樣例輸出

(5, 3): 16711680

分析

1、顏色要唯一。2、陣列外圍也要考慮。3、x表示列,y表示行。具體看程式

C++程式

#include<iostream>
#include<cmath>
#include<map>

using namespace std; 

const int N=1005;

int a[N][N];

int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//8個方向 

map<int,int>d;//d[i]=j表示顏色為i的畫素點的個數為j

int main()
{
	int n,m,tol;
	scanf("%d%d%d",&m,&n,&tol);
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	  {
	  	scanf("%d",&a[i][j]);
	  	d[a[i][j]]++;//顏色為a[i][j]的畫素點的個數加一 
	   }
	int num=0,x=0,y=0;
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	  {
	  	  if(d[a[i][j]]==1)//保證這種顏色是獨一無二的 
	  	  {
	  	  		bool flag=true;
	  	  		for(int k=0;k<8;k++)//周圍8個畫素點
	  	  		{
	  	  			int fx=i+dir[k][0];
	  	  			int fy=j+dir[k][1];
	  	  			if(0<=fx&&fx<n&&0<=fy&&fy<m&&abs(a[i][j]-a[fx][fy])<=tol)
	  	  			{
	  	  				flag=false;
	  	  				break;
					}
				}
				if(flag)
				{
					num++;
					x=i;
					y=j;
				}
		  }
	  }
	if(num==0)
	  printf("Not Exist\n");
	else if(num==1)
	  printf("(%d, %d): %d\n",y+1,x+1,a[x][y]);//注意需要先輸出y+1,再輸出x+1 
	else
	  printf("Not Unique\n");
	return 0; 
} 

 

相關文章