[Gauss]POJ1222 EXTENDED LIGHTS OUT

题意:给一个5*6的矩阵

1代表该位置的灯亮着, 0代表该位置的等没亮

按某个位置的开关,可以同时改变 该位置 以及 该位置上方、下方、左方、右方, 共五个位置的灯的开、关(1->0, 0->1)

问能否将所有的灯关闭 若能 输出需要按哪些地方; 不能输出-1

高斯消元的入门题。

每个位置可以列出一个方程, 列出增广矩阵:

  每个位置可以形成增广矩阵的一行, 每行都有30个系数 分别代表(0到29号灯), 将该位置可以影响到的位置(自己、上、下、左、右)对应的置1, 其余置0

  这样就形成了29*29的系数矩阵。

  将初始状态置入最后一列 就形成了增广矩阵

接下来只要解方程组即可。

化成约化阶梯后最后一列即为该方程组的解。

P.s. 需要注意的是:因为是矩阵表示的是灯的开关状态,所以解的过程中不应出现0、1以外的其余数字

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <climits>
  5 #include <cctype>
  6 #include <cmath>
  7 #include <string>
  8 #include <sstream>
  9 #include <iostream>
 10 #include <algorithm>
 11 #include <iomanip>
 12 using namespace std;
 13 #include <queue>
 14 #include <stack>
 15 #include <vector>
 16 #include <deque>
 17 #include <set>
 18 #include <map>
 19 typedef long long LL;
 20 typedef long double LD;
 21 const double pi=acos(-1.0);
 22 const double eps=1e-9;
 23 #define INF 0x3f3f3f
 24 #define lson l, m, rt<<1
 25 #define rson m+1, r, rt<<1|1
 26 typedef pair<int, int> PI;
 27 typedef pair<int, PI > PP;
 28 #ifdef _WIN32
 29 #define LLD "%I64d"
 30 #else
 31 #define LLD "%lld"
 32 #endif
 33 //#pragma comment(linker, "/STACK:1024000000,1024000000")
 34 //LL quick(LL a, LL b){LL ans=1;while(b){if(b & 1)ans*=a;a=a*a;b>>=1;}return ans;}
 35 //inline int read(){char ch=‘ ‘;int ans=0;while(ch<‘0‘ || ch>‘9‘)ch=getchar();while(ch<=‘9‘ && ch>=‘0‘){ans=ans*10+ch-‘0‘;ch=getchar();}return ans;}
 36 //inline void print(LL x){printf(LLD, x);puts("");}
 37 //inline void read(LL &ret){char c;int sgn;LL bit=0.1;if(c=getchar(),c==EOF) return ;while(c!=‘-‘&&c!=‘.‘&&(c<‘0‘||c>‘9‘)) c=getchar();sgn=(c==‘-‘)?-1:1;ret=(c==‘-‘)?0:(c-‘0‘);while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret=ret*10+(c-‘0‘);if(c==‘ ‘||c==‘\n‘){ ret*=sgn; return ; }while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret+=(c-‘0‘)*bit,bit/=10;ret*=sgn;}
 38
 39 int a[35][35];
 40 int x[35];
 41
 42 void debug()
 43 {
 44     for(int i=0;i<30;i++)
 45     {
 46         for(int j=0;j<=30;j++)
 47             printf("%d ", a[i][j]);
 48         printf("\n");
 49     }
 50     printf("\n");
 51 }
 52
 53 void Gauss()
 54 {
 55     for(int k=0, col=0;k<30 && col<30;k++, col++)
 56     {
 57         int maxr=k;
 58         for(int i=k+1;i<30;i++)
 59             if(abs(a[i][col])>abs(a[maxr][col]))
 60                 maxr=i;
 61         if(k!=maxr)
 62         {
 63             for(int j=col;j<=30;j++)
 64                 swap(a[k][j], a[maxr][j]);
 65 //            swap(x[k], x[maxr]);
 66         }
 67 //        x[k]/=a[k][col];
 68 //        for(int j=col+1;j<30;j++)
 69 //            a[k][j]/=a[k][col];
 70 //        a[k][col]=1;
 71 //        for(int i=0;i<30;i++)
 72 //            if(i!=k)
 73 //            {
 74 //                x[i]-=x[k]*a[i][col];
 75 //                for(int j=col+1;j<30;j++)
 76 //                    a[i][j]-=a[k][j]*a[i][col];
 77 //                a[i][col]=0;
 78 //            }
 79         if(a[k][col]==0)
 80         {
 81             k--;
 82             continue;
 83         }
 84         for(int i=k+1;i<30;i++)
 85             if(a[i][col])
 86                 for(int j=col;j<=30;j++)
 87                     a[i][j]^=a[k][j];
 88 //        debug();
 89     }
 90     for(int i=29;i>=0;i--)
 91     {
 92         x[i]=a[i][30];
 93         for(int j=i+1;j<30;j++)
 94             x[i]^=(a[i][j] && x[j]);
 95     }
 96 }
 97 int main()
 98 {
 99 //    freopen("out.txt", "w", stdout);
100     int t, ca=1;
101     scanf("%d", &t);
102     while(t--)
103     {
104         memset(a, 0, sizeof(a));
105         for(int i=0;i<30;i++)
106             scanf("%d", &a[i][30]);
107         printf("PUZZLE #%d\n", ca++);
108         for(int i=0;i<5;i++)
109             for(int j=0;j<6;j++)
110             {
111                 int t=i*6+j;
112                 a[t][t]=1;
113                 if(i>0)
114                     a[(i-1)*6+j][t]=1;
115                 if(i<4)
116                     a[(i+1)*6+j][t]=1;
117                 if(j>0)
118                     a[i*6+j-1][t]=1;
119                 if(j<5)
120                     a[i*6+j+1][t]=1;
121             }
122 //        debug();
123         Gauss();
124         for(int i=0;i<5;i++)
125             for(int j=0;j<6;j++)
126             {
127                 printf("%d", x[i*6+j]);
128                 if(j==5)
129                     printf("\n");
130                 else
131                     printf(" ");
132             }
133     }
134     return 0;
135 }

POJ 1222

时间: 2024-10-10 22:07:35

[Gauss]POJ1222 EXTENDED LIGHTS OUT的相关文章

poj1222 EXTENDED LIGHTS OUT

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7202   Accepted: 4718 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons eac

【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT

由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组: 引用题解: http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d297445264 题目大意:给你一个5*6的矩阵,矩阵里每一个单元都有一个灯和一个开关,如果按下此开关,那么开关所在位置的那个灯和开关前后左右的灯的状态都会改变(即由亮到不亮或由不亮到亮).给你一个初始的灯的状态,问怎样控制每一个开关使得所有的灯最后全部熄灭(此题保证有唯一解). 解题思路:高斯消元.很显然每个

EXTENDED LIGHTS OUT poj1222 高斯消元法

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6443   Accepted: 4229 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons eac

【POJ 1222】EXTENDED LIGHTS OUT

EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7333 Accepted: 4792 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each).

POJ EXTENDED LIGHTS OUT 1222【高斯消元】

Language: Default EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7672   Accepted: 4996 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 row

POJ 1222 EXTENDED LIGHTS OUT 高斯消元

点击打开链接 EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6492   Accepted: 4267 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 butt

uva 1560 - Extended Lights Out(枚举 | 高斯消元)

题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5?6的矩阵,每个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,如果按了这个位置的开关,将会导致周围包括自己位置的灯状态变换,求一个按开关位置,保证所有灯都灭掉. 解题思路: 枚举,枚举第一行的状态,然后递推出后面四行的状态. 高斯消元,对于每个位置对定变量,这样列出30个方程求解. C++ 枚举 #include <cstdio> #include <cstring> #include &

UVA 1560 - Extended Lights Out(高斯消元)

UVA 1560 - Extended Lights Out 题目链接 题意:给定一个矩阵,1代表开着灯,0代表关灯,没按一个开关,周围4个位置都会变化,问一个按的方法使得所有灯都变暗 思路:两种做法: 1.枚举递推 这个比较简单,就枚举第一行,然后递推过去,每次如果上一行是亮灯,则下一行开关必须按下去 2.高斯消元, 这个做法比较屌一些,每个位置对应上下左右中5个位置可以列出一个异或表达式,然后30个位置对应30个异或表达式,利用高斯消元法就能求出每个位置的解了 代码: 高斯消元法: #inc

poj 1222 EXTENDED LIGHTS OUT 高斯消元法

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6872   Accepted: 4532 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons eac