2145 - 多米诺骨牌

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

小东非常喜欢玩多米诺骨牌,他有一套很特殊的骨牌,正面和反面都印有数字,并且这些数字大于等于1,小于等于6。小东很喜欢偶数,所以他想将他所有的多米诺骨牌摆成一排,使得正面数字的和和背面数字的和为偶数。但是有些情况下的初始状态并不是这样的,所以他需要将一些牌翻转180度,使其反面向前,正面向后,每翻转一次需要一秒钟,问小东最少需要多少秒钟才能打到他的目的。

题目输入

多组输入数据,第一行数字的总个数N(n  100000),第二行N个数字,每个数字都不会超过32位整数的范围,并且我们保证大于等于2.

题目输出

多组测试数据,第一行N,表示有N个多米诺骨牌.(1  N  100)

第2行到N + 1行,每行两个数字,第一个是正面,第二个是反面。且1   X   6

无法完成输出-1

输入/输出样例

输入格式

2
4 2
6 4
1
1 3
3
1 4
2 3
4 4

输出格式

0
-1
1

C语言解答

#include<stdio.h>
main()
{
	int zheng[120],fan[120],n,unsame,sumzheng,sumfan;
	while(scanf("%d",&n)!=EOF)
	{
		unsame=0;
		sumzheng=0;
		sumfan=0;
		while(n--)
		{
			scanf("%d %d",&zheng[n],&fan[n]);
			sumzheng+=zheng[n];
			sumfan+=fan[n];
			if(zheng[n]%2!=fan[n]%2)
			unsame++;
		}
		if(sumzheng%2==1&&sumfan%2==1)
		{
			if(unsame!=0)
			puts("1");
			else
			puts("-1");
			continue;
		}
		if(sumzheng%2!=sumfan%2)
		{
			puts("-1");
			continue;
		}
		if(sumzheng%2==0&&sumfan%2==0)
		{
			puts("0");
			continue;
		}
	}
}

C++解答

#include<stdio.h>
#include<string.h>

int depth[6];
int sum_Upper, sum_Lower;
int m;

int main(){
    int i, j, k;
    int a, b;
    //freopen("1.in", "r", stdin);
    //freopen("1.out", "w", stdout);
    while(scanf("%d", &m) != EOF){
        sum_Lower = sum_Upper = 0;
        memset(depth, 0, sizeof(depth));
        for(i = 0; i < m; i++){
            scanf("%d%d", &a, &b);
            sum_Upper += a;
            sum_Lower += b;
            int s = a - b < 0 ? b - a : a - b;
            depth[s]++;
        }
        if((sum_Upper + sum_Lower ) % 2){
            printf("-1\n");
            continue;
        }
        bool q = sum_Upper % 2 ? false : true;
        bool p = sum_Lower % 2 ? false : true;
        if(q && p){
            printf("0\n");
            continue;
        }
        if(depth[1] || depth[3] || depth[5]){
            printf("1\n");
        }
        else{
            printf("-1\n");
        } 
    }
    return 0;
}