PAT (Basic Level) Practice 1068 萬綠叢中一點紅
阿新 • • 發佈:2018-12-20
要求你找出萬綠叢中的一點紅,
即有獨一無二顏色的那個畫素點-> 獨一無二,在圖中只存在一個,不重複
並且該點的顏色與其周圍 8 個相鄰畫素的顏色差充分大-> 充分大,但是=0,並且這樣的點只有一個,也是可以的(測試點5)
還有一個非常關鍵的資訊(百度後才發現):判斷是否重複用O(m*n)->接近O(n²)是不會超時的
↑這個如果能發現那就很簡單了……
struct pos儲存座標、數值value、周圍一圈超過tol的數的數量count
再用vector儲存符合要求的數,儲存原則是看count的值:
如果得到了一個count是比vector的count值要大的數,那就把vector清空,再放入
如果count相同,直接放入
AC程式碼:
#include<bits/stdc++.h> using namespace std; struct pos{ int x; int y; int value; int count; }; int m,n,tol; int table[1050][1050]; bool isunique(int a,int y,int x){ for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(a==table[i][j]&& (j!=x || i!=y)){ return false; } } } return true; } int main(){ scanf("%d %d %d",&m,&n,&tol); vector<pos> tab; vector<pos>::iterator iter; for(int i = 0;i<n+5;i++){ for(int j = 0;j<m+5;j++) table[i][j] = -1; } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++) scanf("%d",&table[i][j]); } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ int p = table[i][j]; if(isunique(p,i,j)){ pos po; po.x=j; po.y=i; po.value=p; po.count=0; //上方一行 if((p-table[i-1][j-1]>tol||p-table[i-1][j-1]<-tol)&&table[i-1][j-1]!=-1) po.count++; if((p-table[i-1][j]>tol||p-table[i-1][j]<-tol)&&table[i-1][j]!=-1) po.count++; if((p-table[i-1][j+1]>tol||p-table[i-1][j+1]<-tol)&&table[i-1][j+1]!=-1) po.count++; //中間一行 if((p-table[i][j-1]>tol||p-table[i][j-1]<-tol)&&table[i][j-1]!=-1) po.count++; if((p-table[i][j+1]>tol||p-table[i][j+1]<-tol)&&table[i][j+1]!=-1) po.count++; //下方一行 if((p-table[i+1][j-1]>tol||p-table[i+1][j-1]<-tol)&&table[i+1][j-1]!=-1) po.count++; if((p-table[i+1][j]>tol||p-table[i+1][j]<-tol)&&table[i+1][j]!=-1) po.count++; if((p-table[i+1][j+1]>tol||p-table[i+1][j+1]<-tol)&&table[i+1][j+1]!=-1) po.count++; if(po.count>=0){ if(tab.size()==0) tab.push_back(po); else{ if(tab[0].count<po.count){ tab.clear(); tab.push_back(po); } else if(tab[0].count==po.count){ tab.push_back(po); } } } } } } int size = tab.size(); if(size==0||(size>=2&&tab[0].count==0)){ cout<<"Not Exist\n"; }else if(size==1){ cout<<"("<<tab[0].x<<", "<<tab[0].y<<"): "<<tab[0].value<<endl; }else if(size>=2){ cout<<"Not Unique\n"; } return 0; }