首页 > 代码库 > POJ_1222_高斯消元
POJ_1222_高斯消元
题目描述:
每组数据给出一个5*6的0 1矩阵,每次操作可以把某个位置及其四周的位置0 1置换,要求输出操作位置的矩阵。
思路:
每个位置操作2次则等于没有操作,所以每个位置有操作和不操作两种选择,爆搜应该会超时。
在网上看到了高斯消元的做法,按照每个操作位置影响的位置构造系数矩阵,然后读入题目的数据构成增广矩阵。
接下来的做法便和高斯消元一样,只是把原来的-变成了^。
30条方程,30个未知量,所以最终的解也是唯一。
#include<cstdio>#include<iostream>using namespace std;int a[31][31] = {0};int main(){ int n; cin >> n; for(int x = 1;x <= n;x++) { for(int i = 0;i < 30;i++) { a[i][i] = 1; if(i > 5) a[i][i-6] = 1; if(i < 24) a[i][i+6] = 1; if(i%6) a[i][i-1] = 1; if((i+1)%6) a[i][i+1] = 1; } for(int i = 0;i < 30;i++) cin >> a[i][30]; for(int i = 0;i < 30;i++) { int temp = i; for(;temp < 30;temp++) { if(a[temp][i]) { for(int j = 0;j <= 30;j++) swap(a[temp][j],a[i][j]); break; } } for(int j = 0;j < 30;j++) { if(j != i && a[j][i]) { for(int k = i;k <= 30;k++) { a[j][k] ^= a[i][k]; } } } } cout << "PUZZLE #" << x << endl; for(int i = 0;i < 30;i++) { if((i+1)%6) cout << a[i][30] << " "; else cout << a[i][30] << endl; } } return 0;}
POJ_1222_高斯消元
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。