poj1222开关问题
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                poj1222开关问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                題意:有一個5 * 6的矩陣,每個位置表示燈,1表示燈亮,0表示燈滅。?
 然后如果選定位置i,j點擊,則位置i,j和其上下左右的燈的狀態都會反轉。?
 現在要你求出一個5 * 6的矩陣,1表示這個燈被點擊過,0表示沒有。?
 要求這個矩陣能夠使得原矩陣的燈全滅。?
 開始沒有理解到說的那個at bt ct 是什么
 其實是在A[i][j]按下去的時候他所影響到的 li位置處的狀態,這個狀態在一個矩陣的M*N 的N M確定之后就隨著確定了,不過我沒有找到其中的規律,><
 然后利用模2加的性質就是相當于異或運算,就可以構造出方程式來出x(i,j)的每一個值
 https://blog.csdn.net/u013508213/article/details/47263183
?
#include <iostream>// 用G++,還有就是不能外掛 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <map> //#define IO ios::sync_with_stdio(false),cin.tie(0), cout.tie(0); //#pragma comment(linker, "/STACK:1024000000,1024000000") void ex_gcd(int a, int b, int &d, int &x, int &y) { if (!b) { x = 1; y = 0; d = a; } else { ex_gcd(b, a%b, d, y, x); y -= x * (a / b); }; } int gcd(int a, int b) { return b ? gcd(b, a%b) : a; } int lcm(int a,int b){return a/gcd(a,b)*b;}//先除后乘防溢出 int inv_exgcd(int a, int m) { int d, x, y;ex_gcd(a, m, d, x, y);return d == 1 ? (x + m) % m : -1; } typedef long long ll; const int maxn=1e3; using namespace std; int a[maxn][maxn]; int x[maxn]; int n,m; bool free_x[maxn];//記錄不確定的變元 void init() {memset(a,0,sizeof(a));for(int i=0;i<5;++i)for(int j=0;j<6;++j)///表示對這個A[i][j]確定的上下左右的每個位置的狀態進行初始化沒有找到其中的規律{int t=i*6+j;a[t][t]=1;if(i>0)a[(i-1)*6+j][t]=1;if(i<4)a[(i+1)*6+j][t]=1;if(j>0)a[i*6+j-1][t]=1;if(j<5)a[i*6+j+1][t]=1;} } int Gauss(int equ,int var) {int max_r,col,k;int ta,tb;int Lcm;int temp;int free_x_num=0,free_index;for(int i=0;i<=var;++i) x[i]=0,free_x[i]=true;//轉化為階梯例col=0;//當前列for( k=0,col=0;k<equ&&col<var;++k,++col){//枚舉當前行max_r=k;for(int i=k+1;i<equ;++i)if(abs(a[i][col])>abs(a[max_r][col]))max_r=i;if(max_r!=k)for(int i=k;i<=var;++i) swap(a[k][i],a[max_r][i]);///i=0;if(!a[k][col]){k--;continue;//處理下一列}for(int i=k+1;i<equ;++i){//化為階梯型if(a[i][col]){ // Lcm=lcm(abs(a[i][col]),abs(a[k][col])); // ta=Lcm/abs(a[i][col]),tb=Lcm/abs(a[k][col]); // if(a[i][col]*a[k][col]<0)tb=-tb;for(int j=col;j<=var;++j){a[i][j]^=a[k][j];//((a[i][j]*ta-a[k][j]*tb));}}}}for(int i=k;i<equ;++i)// 無解if(a[i][col]) return -1;if(k<var)// 無窮解{///這這兒可以直接 return var-k;不用求出未知元 // for(int i=k-1;i>=0;--i) // { // free_x_num=0;//用于判斷不確定性變元的數量,若超過一個仍然無法求解(無解) // for(int j=0;j<var;++j) // if(a[i][j]&&free_x[j])free_x_num++,free_index=j; // if(free_x_num>1)continue; // temp=a[i][var]; // for(int j=0;j<var;++j) // { // if(a[i][j]&&j!=free_x_num)temp=(temp-a[i][j]*x[j]); // } // x[free_index]=(temp/a[i][free_index])%7; // free_x[free_index]=false; // }return var-k;}//唯一解for(int i=var-1;i>=0;--i){temp=a[i][var];for(int j=i+1;j<var;++j)if(a[i][j])temp=(temp^(a[i][j]&&x[j]));//cout<<temp<<endl;x[i]=temp;}return 0; } int main() {int t;cin>>t;for(int ca=1;ca<=t;++ca){init();for(int i=0;i<30;++i)scanf("%d",&a[i][30]);int free_num=Gauss(30,30);printf("PUZZLE #%d\n",ca);for(int i=0;i<30;++i){printf("%d",x[i]);if((i+1)%6==0)printf("\n");elseprintf(" ");}}return 0; }?
總結
以上是生活随笔為你收集整理的poj1222开关问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: poj2065 SETI
- 下一篇: poj 1830
