1068 万绿丛中一点红 逻辑题

陌陌的pat乙级题解

题解

逻辑题
1. 判断独一无二,那肯定是用map方便了
2. 先全部输入,再去遍历
3. 首先需要满足独一无二,然后判断周围的8个点和当前的差是否大于阈值
4. 用几个标记,记录是否已有答案等

Code

#include <iostream>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
	map<int, int> rap;
	int N, M, K;
	cin >> N >> M >> K;
	// M行 N列
	vector<vector<int>> v(M + 10, vector<int>(N + 10));
	for (int i = 1; i <= M; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			scanf("%d", &v[i][j]);
			rap[v[i][j]]++;
		}
	}
	int f = 0;
	int ans = 0;
	int x, y;
	for (int i = 1; i <= M; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			// 保证他是独特的
			if (rap[v[i][j]] == 1)
			{
				int t = 0;
				int sum = 0;
				// 下面是循环旁边的8个位置
				// 因为有可能i-1 <= 0 或者 j+1 > N 等越界的情况,所以用max和min限制一下
				for (int p = max(1, i - 1); p <= min(M, i + 1); p++)
				{
					for (int k = max(j - 1, 0); k <= min(N, j + 1); k++)
					{
						// 这是他自己
						if (v[i][j] == v[p][k])
							continue;
						// 不行就做个标记
						if (abs(v[i][j] - v[p][k]) <= K)
						{
							t = 1;
							break;
						}
					}
				}
				// 当前的点可以
				if (!t)
				{
					ans = v[i][j];
					x = j, y = i;
					// 如果已经有过点了,重复!
					if (f)
					{
						cout << "Not Unique";
						return 0;
					}
					f = 1;
				}
			}
		}
	}
	if (!f)
		cout << "Not Exist";
	else
	{
		printf("(%d, %d): %d", x, y, ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值