PTA 1068 万绿丛中一点红 (c++ map+思路+分析)
2019-08-17 09:09
239 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44622401/article/details/99688761
分析:首先我想说这个题我感觉题意有点模糊啊,有的点就没有讲清楚。首先题目上说如果符合超过两个就输出Not Unique。但是给的样例里面符合的有16711479和16711680但是却输出了后面这个数。后来我想了想,可能是因为16711479出现了两次,所以也不符合。还有一个点就是,这个数与临边数的阙值,额,这里计算的时候要带绝对值。
思路:首先建立一个二维数组来存储数,然后用map来判断这个数是否只出现了一次(没存储一个数对应的键值加一)。
然后就是判断是否符合,因为有的数周围有八个但有的只有两个或者其他。所以最开始的时候我是想分情况讨论,但是感觉这种方法太笨了而且情况要分好多好多种。参考了一位老哥的思路,然后专门设立了一个数组存储很多方位。就比如说在最中间有个数,那么它左边的数是(i,j-1)右边的数是(i,j+1)上边的数是(i-1,j)。。。。。.看下面的代码把 应该很好理解。
">#include<map> #include<cmath> using namespace std; int m,n,tol,a[1001][1001]; int dir[8][2]={1,0, -1,0, 0,1, 0,-1, 1,1, 1,-1, -1,1 ,-1,-1}; map<int,int>p; bool check(int x, int y) { for(int i=0;i<8;i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx>=0&&xx<n&&yy<m&&yy>=0&&abs(a[xx][yy]-a[x][y])<=tol) return false; } return true; } int main() { int count=0,t1,t2; cin>>m>>n>>tol; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>a[i][j]; p[a[i][j]]++; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(check(i,j)&&p[a[i][j]]==1) { count++; t1=i,t2=j; } if(!count) cout<<"Not Exist"; else if(count>=2) cout<<"Not Unique"; else printf("(%d, %d): %d",t2+1,t1+1,a[t1][t2]); }
相关文章推荐
- C++ PTA 1002 写出这个数
- PAT 1068. 万绿丛中一点红(20)
- PAT Basic 1068. 万绿丛中一点红(20)(C语言实现)
- PTA 1088 三人行 (c++)
- 1068. 万绿丛中一点红(20)
- 1068. 万绿丛中一点红(20)
- 万绿丛中一点红 (PAT-1068)
- pat 乙级 1068. 万绿丛中一点红(20)
- PTA-浙大数据结构MOOC-最大子列和问题(C++版-4种方法)
- PTA 输出全排列 (20分)C++解法
- PTA C++多边形周长计算(继承) (25 分)
- 1068. 万绿丛中一点红(20)
- PTA 递归求数组元素的最大值(10分)C++解法
- PTA 1069 微博转发抽奖 (c++)
- PAT 1068. 万绿丛中一点红(20)
- PAT 1068. 万绿丛中一点红(20)
- PTA 1070 结绳 (c++ 贪心算法)
- 小白成长记之PTA乙级题 1068
- PTA 7-2 然后是几点(15分)初学c++
- 1068. 万绿丛中一点红(20)