hihocoder-1196 : 高斯消元·二

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食。当他们结账后,看到便利店门口还有其他的活动。

店主:买了东西还可以参加游戏活动哦,如果能够完成游戏还有额外的奖品。

小Hi和小Ho赶紧凑了过去。

店主放了一块游戏板在店门口,有5行6列格子。左上角为坐标(1,1)。一部分格子是亮着的,另一部分是暗着的。

 当按下某一个格子时,它和上下左右4个格子的状态就会改变。原来亮着的格子变成暗的,原来暗的格子会变亮。比如下图中按下标记有红叉的格子后,绿色虚线区域内的格子状态都会改变:

店主给出初始的状态,参加游戏的人员需要通过按下某些格子,让游戏板上所有的灯都亮起来就可以赢得奖品。

小Ho:这不就是开关灯问题么,看我来解决它!

本题改编自ACMICPC Greater New York 2002 EXTENDED LIGHTS OUT

   

提示:异或方程组

 

输入

第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是暗的。

保证一定存在解,且一定存在暗着的格子。

输出

需要按下的格子数量k,表示按下这k个位置后就可以将整个游戏板所有的格子都点亮。

接下来k行,每行一个坐标(x,y),表示需要按下格子(x,y)。x坐标较小的先输出,若x相同,则先输出y坐标较小的。

样例输入
001111
011111
111111
111110 
111100
样例输出
2
1 1
5 6
 
/**
    题意:给一个矩阵,全部转化成1
    做法:高斯消元 矩阵的建立 要求输出按得按钮的坐标
**/
#include <iostream>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#define maxn 40
using namespace std;
int mmap[maxn][maxn];
int x[maxn];
int Guess(int equ, int val)
{
    int k;
    int j;
    int t;
    for(int i = 0; i < equ; i++)
    {
        for(k = i; k < val; k++)    ///该列不为0的数的位置
        {
            if(mmap[k][i]) {
                break;
            }
        }
        if(k != i)
        {
            for(j = 0; j <= val; j++) {
                swap(mmap[i][j], mmap[k][j]);
            }
        }
        for(k = 0; k < equ; k++)
        {
            if(k != i && mmap[k][i])
            {
                for(j = 0; j <= val; j++)
                {
                    mmap[k][j] ^= mmap[i][j];
                }
            }
        }
    }
}
void init() /// 相关联的位置
{
    memset(mmap, 0, sizeof(mmap));
    memset(x, 0, sizeof(x));
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 6; j++)
        {
            int tt = (i * 6) + j;
            mmap[tt][tt] = 1;
            if(i > 0) {
                mmap[(i - 1) * 6 + j][tt] = 1;
            }
            if(i < 4) {
                mmap[(i + 1) * 6 + j][tt] = 1;
            }
            if(j > 0) {
                mmap[i * 6 + j - 1][tt] = 1;
            }
            if(j < 5) {
                mmap[i * 6 + j + 1][tt] = 1;
            }
        }
    }
}
char ch[10];
int main()
{
    init();
    int res = 0;
    for(int i = 0; i < 5; i++)
    {
        scanf("%s", ch);
        for(int j = 0; j < 6; j++)
        {
            int tt = ch[j] == '0' ? 1 : 0;
            mmap[res++][30] = tt;
        }
    }
    Guess(30, 30);
    int temp = 0;
    for(int i = 0; i < 30; i++)
    {
        if(mmap[i][30]) {
            temp++;
        }
    }
    printf("%d\n", temp);
    for(int i = 0; i < 30; i++)
    {
        if(mmap[i][30]) {
            printf("%d %d\n", (i / 6) + 1, (i % 6) + 1);
        }
    }
    return 0;
}
View Code

 

 

posted on 2015-09-02 18:32  `Elaine  阅读(315)  评论(0编辑  收藏  举报

导航