[Gauss]POJ1222 EXTENDED LIGHTS OUT
题意:给一个5*6的矩阵
1代表该位置的灯亮着, 0代表该位置的灯没亮
按某个位置的开关,可以同时改变 该位置 以及 该位置上方、下方、左方、右方, 共五个位置的灯的开、关(1->0, 0->1)
问能否将所有的灯关闭 若能 输出需要按哪些地方; 不能输出-1
高斯消元的入门题。
每个位置可以列出一个方程, 列出增广矩阵:
每个位置可以形成增广矩阵的一行, 每行都有30个系数 分别代表(0到29号灯), 将 可以影响该位置改变的 位置(自己、上、下、左、右)对应的置1, 其余置0
这样就形成了30*30的系数矩阵。
将初始状态置入最后一列 就形成了增广矩阵
接下来只要解方程组即可。
化成约化阶梯后最后一列即为该方程组的解。
P.s. 需要注意的是:因为是矩阵表示的是灯的开关状态,所以解的过程中不应出现0、1以外的其余数字 即 01方程 用异或求解
- int a[][]; // 增广矩阵
- int x[]; // 解
- int free_x[]; // 标记是否为自由未知量
- int n, m;
- void debug()
- {
- for(int i=;i<n*n;i++)
- {
- for(int j=;j<n*n;j++)
- printf("%d ", a[i][j]);
- printf("\n");
- }
- }
- void Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
- {
- //转换为阶梯形式
- int col=, k, num=;
- for(k=;k<n && col<m;k++, col++)
- {//枚举行
- int max_r=k;
- for(int i=k+;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
- if(abs(a[i][col])>abs(a[max_r][col]))
- max_r=i;
- if(max_r!=k)// 与第k行交换
- for(int j=col;j<m+;j++)
- swap(a[k][j], a[max_r][j]);
- if(!a[k][col])// 说明该col列第k行以下全是0了
- {
- k--;
- free_x[num++]=col;
- continue;
- }
- for(int i=k+;i<n;i++)// 枚举要删除的行
- if(a[i][col])
- for(int j=col;j<m+;j++)
- a[i][j]^=a[k][j];
- }
- // debug();
- // printf("%d %d\n", col, k);
- //
- // for(int i=k;i<n;i++)
- // if(a[i][col])
- // return -1; // 无解
- // if(k<m) //m-k为自由未知量个数
- // {
- // int stat=1<<(m-k);
- // int ans=INT_MAX;
- // for(int i=0;i<stat;i++)
- // {
- // int cnt=0;
- // for(int j=0;j<m-k;j++)
- // if(i&(1<<j))
- // {
- // x[free_x[j]]=1;
- // cnt++;
- // }
- // else
- // x[free_x[j]]=0;
- // for(int j=k-1;j>=0;j--)
- // {
- // int tmp;
- // for(tmp=j;tmp<m;tmp++)
- // if(a[j][tmp])
- // break;
- // x[tmp]=a[j][m];
- // for(int l=tmp+1;l<m;l++)
- // if(a[j][l])
- // x[tmp]^=x[l];
- // cnt+=x[tmp];
- // }
- // if(cnt<ans)
- // ans=cnt;
- // }
- // return ans;
- // }
- //
- // 唯一解 回代
- for(int i=m-;i>=;i--)
- {
- x[i]=a[i][m];
- for(int j=i+;j<m;j++)
- x[i]^=(a[i][j] && x[j]);
- }
- // int ans=0;
- // for(int i=0;i<n*n;i++)
- // ans+=x[i];
- // return ans;
- }
- void init()
- {
- n=, m=;
- memset(a, , sizeof(a));
- memset(x, , sizeof(x));
- for(int i=;i<n;i++)
- for(int j=;j<m;j++)
- {
- int t=i*m+j;
- a[t][t]=;
- if(i>)
- a[(i-)*m+j][t]=;
- if(i<n-)
- a[(i+)*m+j][t]=;
- if(j>)
- a[i*m+j-][t]=;
- if(j<m-)
- a[i*m+j+][t]=;
- }
- }
- int main()
- {
- int t, ca=;
- scanf("%d", &t);
- while(t--)
- {
- init();
- for(int i=;i<n*m;i++)
- scanf("%d", &a[i][n*m]);
- printf("PUZZLE #%d\n", ca++);
- Gauss(n*m, n*m);
- for(int i=;i<n;i++)
- for(int j=;j<m;j++)
- {
- printf("%d", x[i*m+j]);
- if(j==)
- printf("\n");
- else
- printf(" ");
- }
- }
- return ;
- }
POJ 1222
[Gauss]POJ1222 EXTENDED LIGHTS OUT的更多相关文章
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...
- [poj1222]EXTENDED LIGHTS OUT(高斯消元)
题意:每个灯开启会使自身和周围的灯反转,要使全图的灯灭掉,判断灯开的位置. 解题关键:二进制高斯消元模板题. 复杂度:$O({n^3})$ #include<cstdio> #includ ...
- poj1222 EXTENDED LIGHTS OUT
设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵). 方便起见,矩阵行列下标均从1开始. 考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j ...
- POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组
http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...
- 【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT
由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组: 引用题解: http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d2974452 ...
- EXTENDED LIGHTS OUT poj1222 高斯消元法
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6443 Accepted: 42 ...
- POJ 1222 EXTENDED LIGHTS OUT(反转)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12616 Accepted: 8 ...
- POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...
随机推荐
- ASP根据IP来判断跳转页面
真正IP的取得应该这样: 程序代码 ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") if ip = "" ...
- Jquery方法大全
一.JQuery常用的方法 :(JQuery中90%都是方法,没有参数是获取,带参数是设置) $("#id").css('backgroundColor','blue'); .cs ...
- 我踩过的Alwayson的坑!(上集)
最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲.遇到了下面一些问题,提醒自己也给后来人做些记录. EntityFramework支不支持Alwayson? 起因 ...
- Scala语言初识
scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让 ...
- web开发常用图片格式
web开发常用图片格式有:gif jpg/jpeg png gif:图片压缩率高,可以显示动画,但是只能显示256色,可能造成颜色丢失. jpg:图片压缩率高(有损压缩),可以用小文件来显示 ...
- C#中的集合
[集合不同于数组,是一组可变类型的.可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作.一般来讲,为了便于操作这些元素的类型是相同的] [集合与数组的区别:数组是连续的.同 ...
- 禁止button响应回车(.net页面)
1. 深层次来说这不是 ASP.NET 的问题, 而是 html form 的 submit 按钮就是如何设计的. 当你的光标焦点进入某个表单元素的时候,会激活该表单中第一个(流布局顺从左到右,从上至 ...
- [.Net MVC] 使用 log4net 日志框架
项目:后台管理平台 意义:项目开发中提出增加日志功能,对关键的操作.程序运行中的错误信息进行记录,这对程序部署后的调试有很大意义. 注:本文只是对网上搜集的信息进行了整合,以备今后查询. 关键字:.N ...
- 376. Wiggle Subsequence
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...
- [翻译][MVC 5 + EF 6] 8:更新相关数据
原文:Updating Related Data with the Entity Framework in an ASP.NET MVC Application 1.定制Course的Create和E ...