1068 万绿丛中一点红 (20 分)

1068

知识点

这道题可以学习的地方还挺多的。

  1. vector二维数组的表示与初始化
vector<vector<int>> v;
//注意这里的m、n必须要事先输入
v.resize(n,vector<int>(m));
  1. 求坐标的周围8个坐标
    int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
    for(int k=0;k<8;k++){
        int tx=i+dir[k][0];
        int ty=j+dir[k][1];
    }

题解

抄还抄不对,唉,,从昨天找bug找到现在Orz
处处是细节…
我自己第一遍写的时候,用的是cin>>n>>m;因为它的行列正好是相反的。然后借鉴柳神的代码的时候,人家用的cin>>m>>n;
其实最好还是按照一种思路写到底。
受到@纪流汐夜的一点小建议,将

v[i][j] - v[tx][ty] >= 0 - tol && v[i][j] - v[tx][ty] <= tol

改为

abs(v[i][j] - v[tx][ty]) <= tol

这样更简洁一些~

#include <bits/stdc++.h>

using namespace std;

int m,n,tol,x,y;
vector<vector<int>> v;
bool judge(int i,int j){
    int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
    for(int k=0;k<8;k++){
        int tx=i+dir[k][0];
        int ty=j+dir[k][1];
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&abs(v[i][j] - v[tx][ty]) <= tol){
            return false;
        }
    }
    return true;
}
int main()
{
    int cnt=0;
    cin>>m>>n>>tol;
    v.resize(n,vector<int>(m));
    map<int,int> mapp;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++){
            cin>>v[i][j];
            mapp[v[i][j]]++;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++){
            if(mapp[v[i][j]]==1&&judge(i,j)==true){
                cnt++;
                y=j+1;
                x=i+1;
            }
        }
    }
    if(cnt==1)
        cout<<'('<<y<<", "<<x<<')'<<": "<<v[x-1][y-1]<<endl;
    else if(cnt==0)
        cout<<"Not Exist"<<endl;
    else
        cout<<"Not Unique"<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值