zoukankan      html  css  js  c++  java
  • poj 1222 EXTENDED LIGHTS OUT 高斯消元

    传送门

    题目就是给你一些灯, 点击一个灯, 就会改变它自身和它四周的所有的灯的状态。 给你所有灯的初始状态, 要你输出所有灯的点击情况, 1代表点击, 0代表不点击。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mem(a) memset(a, 0, sizeof(a))
     4 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
     5 int a[35][35], ans[35];
     6 void gauss() {
     7     for(int k = 0; k<30; k++) {
     8         int i = k;
     9         while(i<30&&!a[i][k])
    10             i++;
    11         if(i>k) {
    12             for(int r = 0; r<=30; r++)
    13                 swap(a[i][r], a[k][r]);
    14         }
    15         for(int i = 0; i<30; i++) {
    16             if(i!=k && a[i][k]) {
    17                 for(int j = 0; j<=30; j++) {
    18                     a[i][j] ^= a[k][j];
    19                 }
    20             }
    21         }
    22     }
    23     for(int i = 0; i<30; i++) {
    24         if(a[i][30]) {
    25             int j = 0;
    26             while(j<30&&!a[i][j])
    27                 j++;
    28             ans[j] = a[i][30];
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     int t;
    35     cin>>t;
    36     for(int cnt = 1; cnt<=t; cnt++) {
    37         mem(a);
    38         mem(ans);
    39         for(int i = 0; i<30; i++) {
    40             scanf("%d", &a[i][30]);
    41         }
    42         for(int i = 0; i<30; i++)
    43             a[i][i] = 1;
    44         for(int i = 0; i<5; i++) {
    45             for(int j = 0; j<6; j++) {
    46                 for(int k = 0; k<4; k++) {
    47                     int x = i+dir[k][0];
    48                     int y = j+dir[k][1];
    49                     if(x>=0&&x<5&&y>=0&&y<6) {
    50                         a[i*6+j][x*6+y] = 1;
    51                     }
    52                 }
    53             }
    54         }
    55         gauss();
    56         printf("PUZZLE #%d
    ", cnt);
    57         for(int i = 0; i<30; i++) {
    58             int x = i/6;
    59             int y = i%6;
    60             a[x][y] = ans[i];
    61         }
    62         for(int i = 0; i<5; i++) {
    63             printf("%d", a[i][0]);
    64             for(int j = 1; j<6; j++) {
    65                 printf(" %d", a[i][j]);
    66             }
    67             puts("");
    68         }
    69     }
    70 }
  • 相关阅读:
    华为"128为大整数相加"机试题
    ORA-12545: 因目标主机或对象不存在, 连接失败
    VS2010 安装使用STLPort
    Debian 入门安装与配置1
    CF1072A Palindromic Twist 思维
    解决让刷新页面时不提示 "重试或取消”对话框
    php优化及高效提速问题小结
    让Tomcat支持php
    Php邮件发送源码
    使用iconv提示未知错误
  • 原文地址:https://www.cnblogs.com/yohaha/p/5009691.html
Copyright © 2011-2022 走看看