zoukankan      html  css  js  c++  java
  • 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
    ", temp);
        for(int i = 0; i < 30; i++)
        {
            if(mmap[i][30]) {
                printf("%d %d
    ", (i / 6) + 1, (i % 6) + 1);
            }
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    Linux PCI网卡驱动的详细分析
    moand的编程学形式:一个(高阶)类型包办程序的组织--类型关乎复合
    范畴论完全解读:函子是范畴(高阶类型)间的映射
    函数式编程从起点到终点
    锁的本质:操作的序列化
    并发编程概述--C#并发编程经典实例
    异步IO的概念
    基于事件的并发编程
    runloop是iOS系统上的actor模式
    Monad、Actor与并发编程--基于线程与基于事件的并发编程之争
  • 原文地址:https://www.cnblogs.com/chenyang920/p/4779244.html
Copyright © 2011-2022 走看看