PAT乙级1068

快快快趁着熄灯之前把博客发出来

首先贴题目链接点击打开链接

然后上代码【我突然意识到我有个不写注释的坏习惯......以后要改!】

#include<iostream>
#include<vector>
#include<map>
#include<math.h>
using namespace std;
class message{
	public:
		int count;
		int n;
		int m;
		message(){
			count=0;
			n=0;
			m=0;
		}
};
vector< vector<int> > colors;
int tol,m,n;
int test(int n_,int m_){
	int temp=colors[n_][m_];
	int count=0;
		if(n_-1>=0&&abs(colors[n_-1][m_]-temp)>tol||n_-1<0){
			if(n_+1<n&&abs(colors[n_+1][m_]-temp)>tol||n_+1>=n){
				if(m_-1>=0&&abs(colors[n_][m_-1]-temp)>tol||m_-1<0){
					if(m_+1<m&&abs(colors[n_][m_+1]-temp)>tol||m_+1>=n){
						if(n_-1>=0&&m_-1>=0&&abs(colors[n_-1][m_-1]-temp)>tol||n_-1<0||m_-1<0){
							if(m_+1<m&&n_-1>=0&&abs(colors[n_-1][m_+1]-temp)>tol||n_-1<0||m_+1>=n){
								if(n_+1<n&&m_-1>=0&&abs(colors[n_+1][m_-1]-temp)>tol||n_+1>=n||m_-1<0){
									if(m_+1<m&&n_+1<n&&abs(colors[n_+1][m_+1]-temp)>tol||n_+1>=n||m_+1>=n){
										return 1;
									}
								}
							}		
						}
					}
				}
			}
		}	
	
	
	return 0;
}
int main(){
	
	scanf("%d%d%d",&m,&n,&tol);
	map<int,message> records;
	for(int i=0;i<n;i++){
		vector<int> temp;
		for(int j=0;j<m;j++){
			int tempcolor;
			scanf("%d",&tempcolor);
			temp.push_back(tempcolor);
			if(records[tempcolor].count<=1){
				records[tempcolor].count++;
				records[tempcolor].n=i;
				records[tempcolor].m=j;
			}
		}
		colors.push_back(temp);
	}
	
	map<int,message>::iterator iter=records.begin(),iter1;
	while(iter!=records.end()){
		if(((iter->second).count>1)||test((iter->second).n,(iter->second).m)==0){
			iter1=iter;
			iter++;
			records.erase(iter1);//
		}
		else{
			iter++;
		}
	}
	iter=records.begin();
	if(records.size()>1){
		cout<<"Not Unique";
	}
	else if(records.size()==0){
		cout<<"Not Exist";
	}
	else{
		printf("(%d, %d): %d",(iter->second).m+1,(iter->second).n+1,iter->first);
	}
	
	return 0;
} 

这个题目不难,刷着当练手,过程中还是遇到了一些问题,总结如下。

首先是erasemap的一个靠谱方法,就是建立两个iterator然后倒一下,不然erase返回的是空,用来删除的iterator会失效的。

然后就是很坑的一点,一定要检查自己的格式和样例给的格式是不是一致,比如本题样例里有两个空格,但是题目中没有文字强调,很容易忽略。

最后是更坑的一点,题目描述不确切!没有说边界独一无二的点怎么处理,统一描述成了八个相邻像素......也没有举出对应的实例。好在好像pat是实时回显分数的,这要是csp就惨了......

还有就是,再看一遍题面,发现tab键在输入的时候和空格键是一样的啊哈哈~都可以做输入的分界~

总的来讲还是比较轻松的一道题,再给自己强调一遍~~~以后要记得加注释~~~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值