3601: 记忆翻牌
总提交: 574 测试通过:204
描述
期末要到了,小A却没学会多少OpenGL,为了期末作业,于是他决定做一款很简单的游戏,这个游戏我们都玩过,名字就叫“记忆翻牌”。所谓“记忆翻牌”就是给定N行M列的牌,开牌时会全部面朝上让玩家记忆若干秒之后封排(牌面朝下),玩家需要不断从中找2个一样的消除掉,如果不一样则再次找两个,直到全部消完为止。那么,如果有一张牌是独一无二的话,这张牌就永远消不掉了,小A想确定他给出的牌是否合法,于是他就想到了要找聪明的ACMER帮忙,请你帮他解决这个问题吧。每一个牌面都有一个整数分值,这些整数都小于2^16。
输入
输入有多组测试数据。 每组测试数据包括N+1行: 第一行输入N,M(1≤N,M≤1000)。表示该关有N*M张图片。 下面有N行,每行有M个整数,一个整数代表一张图片。
输出
若数据合法,则输出”Yes”,否则输出”Error!”。
样例输入
2 3
1 2 3
3 2 1
3 4
3 3 2 2
3 3 1 1
3 3 4 4
2 3
1 2 3
2 3 4
样例输出
Yes
Yes
Error!
提示
用map来存储,消的话只要map的second与 2的余数是0就好了。
#include <stdio.h>
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n,m,i,j,a;
while(scanf("%d %d",&n,&m)!=EOF){
map<int,int> q;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a);
q[a]++;//出现的次数
}
}
i=0;
int c=0,d=0;
map<int,int>::iterator it;//迭代器
it=q.begin();
while(it!=q.end()){
if((it->second)%2!=0){
printf("Error!\n");
c=1;
d=1;
}
if(d==1)break;
it++;
}
if(c==0)printf("Yes\n");
}
}