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

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

题目链接

算法分析

题目本身不难,但是非常难get到出题人的全部意图,要注意以下几点:
(1)周围八个点(×)-----边界的点也要考虑在内,如何判断?(看代码的judge函数)
(2)差值-----差的绝对值
(3)唯一存在------颜色不重复

测试点

我这个题卡在测试点三,一开始是因为没有考虑只能出现一次的情况,后来用map修改后还是不行,因此又调了半天,最终发现是在“差值”上面出了问题,应该判断二者的差的绝对值。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int num[N][N];
int x, y; 
int t;
int m, n, tol;
int judge(int x, int y);
map<int, int>on;
int main(){
	scanf("%d%d%d", &m, &n, &tol);
	for(int i = 1; i <= n; ++ i)
		for(int j = 1; j <= m; ++ j){
			scanf("%d", &num[i][j]);
			on[num[i][j]] ++;
		}
	for(int i = 1; i <= n; ++ i)
		for(int j = 1; j <= m; ++ j){
			bool flag = judge(i, j);
			if(flag && on[num[i][j]] == 1){
				++ t;
				x = i, y = j;
			}
		}
	if(t == 0) puts("Not Exist");
	else if(t == 1) printf("(%d, %d): %d", y, x, num[x][y]);
	else	puts("Not Unique");
	return 0;
}
int judge(int x, int y){
	int is = 1;
	int i_low, i_upp, j_low, j_upp;//需要遍历的图的行列边界值
	if(x == 1) i_low = x, i_upp = x + 1;
	else if(x == n) i_low = x - 1, i_upp = x;
	else	i_low = x - 1, i_upp = x + 1;
	if(y == 1) j_low = y, j_upp = y + 1;
	else if(y == n) j_low = y - 1, j_upp = y;
	else j_low = y - 1, j_upp = y + 1;
	for(int i = i_low; i <= i_upp; ++ i)
		for(int j = j_low; j <= j_upp; ++ j){
			if(i == x && j == y) continue;
			if(abs(num[x][y] - num[i][j]) <= tol){
				is = 0;
				break;
			}	
		}
	return is;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crer_lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值