博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1222 EXTENDED LIGHTS OUT
阅读量:5029 次
发布时间:2019-06-12

本文共 4156 字,大约阅读时间需要 13 分钟。

高斯消元第五题。貌似仅仅有这样的套路了,还是我见识少。反正你们大家不要骗我~!

题目大意:

给出由灯组成的5*6的矩阵。当使某一个灯的状态改变时,它相邻的(边相邻,也就是上下左右的,假设有的话)灯的状态也改变。

问改变那些灯的状态能够使全部的灯熄灭。

解题思路:

30个灯,代表着30个方程。

方程的表示是操作那些灯对当前灯有影响。

最后就是高斯消元解方程了。只是是模2的。 

以下是代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-6#define pi acos(-1.0)#define inf 107374182#define inf64 1152921504606846976#define lc l,m,tr<<1#define rc m + 1,r,tr<<1|1#define iabs(x) ((x) > 0 ? (x) : -(x))#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))#define clearall(A, X) memset(A, X, sizeof(A))#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))#define memcopyall(A, X) memcpy(A , X ,sizeof(X))#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )#define min( x, y ) ( ((x) < (y)) ?

(x) : (y) ) using namespace std; struct node { long long num[35]; node() { clearall(num,0); } void clen() { clearall(num,0); } }; struct node matrix[35]; int n,m,len; bool free_x[35]; long long X[35],p; void Debug(void) { puts(""); int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n + 1; j++) { cout << matrix[i].num[j] << " "; } cout << endl; } cout << endl; } int Guass() { int i,j,k,col; clearall(X,0); clearall(free_x,1);//把解集清空。全部变量都标为自由变量 for (k = 0,col = 0; k < m && col < n; ++k, ++col) //枚举行列 { //printf("%d\n",k); //Debug(); int max_r = k;//找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差) while(matrix[max_r].num[col]==0&&max_r<m)max_r++; /*for (i = k + 1; i < m; ++i) { if (iabs(matrix[i].num[col]) > iabs(matrix[max_r].num[col])) max_r = i; }*/ if (max_r != k) //交换 { for (i = k; i < n + 1; ++i) swap(matrix[k].num[i],matrix[max_r].num[i]); } /*if (matrix[k].num[col]!=0 ) //假设相应该列都为0,枚举该行的下一列 { k--; continue; }*/ for (i = k + 1; i < m; ++i) //将k后边的col进行初等变换成行阶梯矩阵 { if (matrix[i].num[col]!=0) { long long x1=matrix[i].num[col],x2=matrix[k].num[col]; for (j = col; j < n + 1; ++j) { matrix[i].num[j] = matrix[i].num[j] *x2- x1*matrix[k].num[j]; matrix[i].num[j] = (matrix[i].num[j]%p+p)%p; } //Debug(); } } } //Debug(); // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这种行(a != 0). 即R(A) != R(A')无解 /*for (i = k; i < m; ++i) { if (iabs(matrix[i].num[col]) >eps) return -1; }*/ // 2. 无穷解的情况: 在n * (n + 1)的增广阵中出现(0, 0, ..., 0)这种行,即说明没有形成严格的上三角阵. // 且出现的行数即为自由变元的个数. 即R(A) = R(A') < n //printf("%d %d\n",k,n); /*if (k < n) { //凝视处为求多解的自由变量 // 首先,自由变元有n - k个,即不确定的变元至少有n - k个. int num = 0,freeidx; for (i = k - 1; i >= 0; --i) { num = 0;// 用于推断该行中的不确定的变元的个数,假设超过1个,则无法求解,它们仍然为不确定的变元. double tmp = matrix[i].num[n]; // 第i行一定不会是(0, 0, ..., 0)的情况。由于这种行是在第k行到第m行. // 相同,第i行一定不会是(0, 0, ..., a), a != 0的情况。这种无解的. for (j = 0; j < n; ++j) { if (iabs(matrix[i].num[j]) > eps && free_x[j]) { num++; freeidx = j; } } if (num > 1) continue; // 无法求解出确定的变元. // 说明就仅仅有一个不确定的变元free_index,那么能够求解出该变元。且该变元是确定的. tmp = matrix[i].num[n]; for (j = 0; j < n; ++j) { if (iabs(matrix[i].num[j])>eps && j != freeidx) tmp -= matrix[i].num[j]*X[j]; } X[freeidx] = tmp/matrix[i].num[freeidx]; free_x[freeidx] = 0; } return n - k; }*/ // 3. 唯一解的情况: 在n * (n + 1)的增广阵中形成严格的上三角阵. // 计算出Xn-1, Xn-2 ... X0. for (i = k - 1; i >= 0; --i) { long long tmp = matrix[i].num[n]; for (j = i + 1; j < n; ++j) { tmp =((tmp- matrix[i].num[j]*X[j])%p+p)%p; } while(tmp%matrix[i].num[i])tmp+=p; X[i] = ((tmp/matrix[i].num[i])%p+p)%p; } return 0; } const char s[9][10]= {"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"}; const int num[9]= {4,3,4,3,5,3,4,3,4}; int main() { int T,case1=1; scanf("%d",&T); p=2; n=30; m=30; while(T--) { clearall(matrix,0); for(int i=0; i<5; i++) { for(int j=0; j<6; j++) { scanf("%d",&matrix[i*6+j].num[n]); matrix[i*6+j].num[i*6+j]=1; if(j>0)matrix[i*6+j-1].num[i*6+j]=1; if(j+1<6)matrix[i*6+j+1].num[i*6+j]=1; if(i>0)matrix[(i-1)*6+j].num[i*6+j]=1; if(i+1<5)matrix[(i+1)*6+j].num[i*6+j]=1; } } //Debug(); Guass(); //Debug(); int cnt=0; bool flat=false; printf("PUZZLE #%d\n",case1++); for(int i=0; i<n; i++) { if(flat)printf(" "); printf("%lld",X[i]); cnt++; flat=true; if(cnt==6) { flat=false; cnt=0; puts(""); } } //Debug(); } return 0; }

转载于:https://www.cnblogs.com/bhlsheji/p/5063941.html

你可能感兴趣的文章
软件测试领域中的10个生存和发展技巧
查看>>
Camera前后摄像头同时预览
查看>>
HDU 1856
查看>>
课堂作业01--架构师的职责
查看>>
iOS计算富文本(NSMutableAttributedString)高度
查看>>
2017/09/15 ( 框架2)
查看>>
Centos下源码安装git
查看>>
gulp-rev-append md5版本号
查看>>
IO流之File类
查看>>
sql 基础语句
查看>>
CF717A Festival Organization(第一类斯特林数,斐波那契数列)
查看>>
oracle直接读写ms sqlserver数据库(二)配置透明网关
查看>>
控件发布:div2dropdownlist(div模拟dropdownlist控件)
查看>>
Oracle composite index column ordering
查看>>
ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表
查看>>
kaggle竞赛
查看>>
区块链入门教程
查看>>
域 搭建OU 组织单元
查看>>
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>