PAT乙级1068
2018-04-03 23:04
155 查看
快快快趁着熄灯之前把博客发出来
首先贴题目链接点击打开链接
然后上代码【我突然意识到我有个不写注释的坏习惯......以后要改!】#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键在输入的时候和空格键是一样的啊哈哈~都可以做输入的分界~
总的来讲还是比较轻松的一道题,再给自己强调一遍~~~以后要记得加注释~~~~
首先贴题目链接点击打开链接
然后上代码【我突然意识到我有个不写注释的坏习惯......以后要改!】#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键在输入的时候和空格键是一样的啊哈哈~都可以做输入的分界~
总的来讲还是比较轻松的一道题,再给自己强调一遍~~~以后要记得加注释~~~~
相关文章推荐
- PAT乙级 1068. 万绿丛中一点红(20)--pat简单易错细节题
- pat 乙级 1068. 万绿丛中一点红(20)
- PAT乙级1068
- 1068. 万绿丛中一点红(20) PAT 乙级
- PAT乙级 1068. 万绿丛中一点红(20)
- 1068. 万绿丛中一点红(20) PAT乙级真题
- [PAT乙级]1068. 万绿丛中一点红(20)
- pat乙级真题 1068. 万绿丛中一点红(20)
- PAT 1068. 万绿丛中一点红(20)-乙级
- PAT乙级(Basic Level)练习题 >骨牌铺方格
- PAT乙级1062
- 1054. 求平均值 (20)-PAT乙级真题
- 1037. 在霍格沃茨找零钱(20)-浙大PAT乙级真题java实现
- 1032. 挖掘机技术哪家强(20)-PAT乙级真题
- 1010. 一元多项式求导 (25)-PAT乙级真题
- 1003. 我要通过!(20)-浙大PAT乙级真题
- 乙级 PAT 1042. 字符统计(20)
- PAT 乙级 1020. 月饼 (25)
- PAT 乙级 1042. 字符统计(20)
- PAT乙级(Basic Level)1010(C++)