pta乙题1068 万绿丛中一点红

此题有坑
1.独一无二的点
2.边上的点例如没有左边的点则认为成立
3.考虑色差正负是都可以的,而不用一定要同正或同负
代码如下

#include <cstdio>
#include <cmath>
using namespace std;
int n,m,tap,a[1500][1500],kase=0,aa,bb;
int hh(int x,int y,int i,int j);
void haha();
int mmp(int x,int y);
int main()
{
   scanf("%d%d%d",&m,&n,&tap);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
	    scanf("%d",&a[i][j]);
   haha();
	if(!kase) 
	   printf("Not Exist");
	  else if(kase==1)
	        printf("(%d, %d): %d",bb,aa,a[aa][bb]);
	       else
	         printf("Not Unique");
	     return 0;
   
} 
int hh(int x,int y,int i,int j)
{
	if(x<1||y<1||x>n||y>m) return 1;//越界认为可以 
	 int w=a[i][j]-a[x][y];
	  if(abs(w)>tap) return 1;//正负用绝对值 
	    return 0;
}
void haha()//八个点判断 
{
	for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     {   
     	  if(hh(i-1,j-1,i,j))
     	 	if(hh(i-1,j,i,j))
     	 	  if(hh(i-1,j+1,i,j))
     	 	    if(hh(i,j-1,i,j))
     	 	      if(hh(i,j+1,i,j))
     	 	        if(hh(i+1,j-1,i,j))
     	 	          if(hh(i+1,j,i,j))
     	 	            if(hh(i+1,j+1,i,j))
     	 	             if(mmp(i,j))
     	{
     		kase++;
     		  aa=i,bb=j;
     	//	  printf("%d ,%d %d\n",aa,bb,a[aa][bb]);
     		   if(kase>1) return ;
     	}     	
     }
}
int mmp(int x,int y)//独一无二判断 
{
	for(int k=1;k<=n;k++)
	 for(int l=1;l<=m;l++)
	 {
	 	if(k==x&&l==y) continue;
	 	if(a[k][l]==a[x][y]) return 0;
	 } 
	 return 1;
}

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/84475983