poj EXTENDED LIGHTS OUT

来源:互联网 发布:rpm e mysql 编辑:程序博客网 时间:2024/05/20 07:58

开关问题是典型的高斯消元问题

不过这道题我一直错了好久,后来发现在对系数矩阵a进行赋值时, 要每次都重新赋值, 不然a作为一个全局变量, 上一次计算的结果造成对下一次结果的影响,下面附上代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[35][35];void gauss(){ int i, j, k; for(k=1; k<=30; k++)   {     if(a[k][k] == 0)      {        for(i=k+1; i<=30; i++)         if(a[i][k])          break;        for(j=k; j<=31; j++)         swap(a[i][j], a[k][j]);      }    for(i=1; i<=30; i++)      if(a[i][k] && i!=k)        for(j=k; j<=31; j++)          a[i][j] ^= a[k][j];   }}int main(){  int t, ca = 1;  scanf("%d", &t);  while(t--)   {     memset(a, 0, sizeof(a));     for(int i=1; i<=30; i++)   // 之前一直把这个for循环放在while外面      {                         // 结果上一次的结果影响了下一次        a[i][i] = 1;        if(i%6 != 0)          a[i][i+1] = 1;         if(i%6 != 1)          a[i][i-1] = 1;         if(i>6)          a[i][i-6] = 1;         if(i<25)         a[i][i+6] = 1;       }     for(int i=1; i<=30; i++)       scanf("%d", &a[i][31]);     gauss();     printf("PUZZLE #%d\n", ca++);     for(int i=1; i<=30; i++)      {        printf("%d", a[i][31]);        if(i%6 == 0)          printf("\n");        else          printf(" ");      }   }  return 0;}


原创粉丝点击