zoukankan      html  css  js  c++  java
  • poj1222

    题意:一个01矩阵,表示灯的亮灭状态,每次操作可以改变一个十字形状内的五个灯的状态。问能否将所有灯熄灭。

    分析:高斯消元法

    对于每个灯的两灭有影响的开关就是它附近十字形内的五个开关。所以对于每个灯可以列一个方程,即周围五个开关异或起来的结果应该可以使该灯熄灭。

    就是利用线性代数知识,写出增广矩阵,化为阶梯形矩阵,有下到上依次解出各未知量。

    View Code
    #include <iostream>
    #include
    <cstdlib>
    #include
    <cstring>
    #include
    <cstdio>
    usingnamespace std;

    #define maxn 35

    int f[maxn][maxn];
    int g[maxn][maxn];
    int x[maxn];
    int dir[5][2] =
    {
    {
    0, 0 },
    {
    0, 1 },
    {
    1, 0 },
    {
    -1, 0 },
    {
    0, -1 } };

    void debug()
    {
    for (int i =0; i <30; i++)
    {
    for (int j =0; j <31; j++)
    cout
    <<""<< g[i][j];
    cout
    << endl;
    }
    cout
    << endl;
    }

    void input()
    {
    for (int i =0; i <5; i++)
    for (int j =0; j <6; j++)
    scanf(
    "%d", &g[i *6+ j][30]);
    }

    void work()
    {
    int k;
    int row, col;
    for (row =0, col =0; row <30&& col <30; row++, col++)
    {
    for (k = row; k <30; k++)
    if (g[k][col] !=0)
    break;
    if (k ==30)
    {
    row
    --;
    continue;
    }
    if (k != row)
    for (int i = col; i <=30; i++)
    swap(g[row][i], g[k][i]);
    for (int i = row +1; i <30; i++)
    if (g[i][col])
    for (int j = col; j <=30; j++)
    g[i][j]
    ^= g[row][j];
    }
    for (int i = row; i >=0; i--)
    {
    x[i]
    = g[i][30];
    for (int j =29; j > i; j--)
    x[i]
    ^= (g[i][j] && x[j]);
    }
    }

    void print()
    {
    for (int i =0; i <5; i++)
    {
    printf(
    "%d", x[i *6]);
    for (int j =1; j <6; j++)
    printf(
    " %d", x[i *6+ j]);
    putchar(
    '\n');
    }
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    for (int i =0; i <5; i++)
    for (int j =0; j <6; j++)
    for (int k =0; k <5; k++)
    {
    int a = i + dir[k][0];
    int b = j + dir[k][1];
    if (a >=0&& b >=0&& a <5&& b <6)
    f[i
    *6+ j][a *6+ b] =1;
    }
    int t;
    scanf(
    "%d", &t);
    for (int i =0; i < t; i++)
    {
    printf(
    "PUZZLE #%d\n", i +1);
    memcpy(g, f,
    sizeof(g));
    input();
    work();
    print();
    }
    return0;
    }

      

  • 相关阅读:
    83. Remove Duplicates from Sorted List
    35. Search Insert Position
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    111. Minimum Depth of Binary Tree
    169. Majority Element
    171. Excel Sheet Column Number
    190. Reverse Bits
  • 原文地址:https://www.cnblogs.com/rainydays/p/2160748.html
Copyright © 2011-2022 走看看