poj1222--EXTENDED LIGHTS OUT(高斯消元)
2015-08-04 08:03
447 查看
题目链接:点击打开链接
题目大意:给出5*6的矩阵,每个格子都是一个开关(开是1,关是0),每改变一个格子,格子自身和上下左右都会改变,问最终都要变成关,需要怎么操作。
每个格子只能被操作0次,或1次,多了是没有意义的,所以按照每一个格子可以影响的位置列出方程组。高斯消元
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int s[5][2] = { {0,0},{0,1},{0,-1},{1,0},{-1,0} } ;
int Map[30][30] , a[30] , ans[30] ;
void solve() {
int i , j , k , l ;
for(i = 0 , k = 0 ; i < 30 && k < 30 ; i++ , k++) {
for(j = i ; j < 30 ; j++)
if( Map[j][k] ) break ;
if( j >= 30 ) {
i-- ;
continue ;
}
if( i != j ) {
for(l = k ; l < 30 ; l++)
swap(Map[i][l],Map[j][l]) ;
swap(a[i],a[j]) ;
}
for(j = i+1 ; j < 30 ; j++) {
if( !Map[j][k] ) continue ;
for(l = k ; l < 30 ; l++)
Map[j][l] = Map[i][l]^Map[j][l] ;
a[j] = a[i]^a[j] ;
}
}
for(i = 29 ; i >= 0 ; i--) {
for(j = i+1 ; j < 30 ; j++)
a[i] = a[i]^(ans[j]*Map[i][j]) ;
ans[i] = a[i] ;
}
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < 30 ; i++) {
if( ans[i] ) {
Map[ i/6 ][ i%6 ] = 1 ;
}
}
for(i = 0 ; i < 5 ; i++) {
for(j = 0 ; j < 5 ; j++)
printf("%d ", Map[i][j]) ;
printf("%d\n", Map[i][5]) ;
}
return ;
}
int main() {
int t , step = 0 ;
int i , j , k , x , y ;
scanf("%d", &t) ;
while( t-- ) {
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < 5 ; i++) {
for(j = 0 ; j < 6 ; j++) {
for(k = 0 ; k < 5 ; k++) {
x = i + s[k][0] ;
y = j + s[k][1] ;
if( x >= 0 && x < 5 && y >= 0 && y < 6 )
Map[x*6+y][i*6+j] = 1 ;
}
}
}
for(i = 0 ; i < 5 ; i++)
for(j = 0 ; j < 6 ; j++)
scanf("%d", &a[i*6+j]) ;
printf("PUZZLE #%d\n", ++step) ;
solve() ;
}
return 0 ;
}
题目大意:给出5*6的矩阵,每个格子都是一个开关(开是1,关是0),每改变一个格子,格子自身和上下左右都会改变,问最终都要变成关,需要怎么操作。
每个格子只能被操作0次,或1次,多了是没有意义的,所以按照每一个格子可以影响的位置列出方程组。高斯消元
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int s[5][2] = { {0,0},{0,1},{0,-1},{1,0},{-1,0} } ;
int Map[30][30] , a[30] , ans[30] ;
void solve() {
int i , j , k , l ;
for(i = 0 , k = 0 ; i < 30 && k < 30 ; i++ , k++) {
for(j = i ; j < 30 ; j++)
if( Map[j][k] ) break ;
if( j >= 30 ) {
i-- ;
continue ;
}
if( i != j ) {
for(l = k ; l < 30 ; l++)
swap(Map[i][l],Map[j][l]) ;
swap(a[i],a[j]) ;
}
for(j = i+1 ; j < 30 ; j++) {
if( !Map[j][k] ) continue ;
for(l = k ; l < 30 ; l++)
Map[j][l] = Map[i][l]^Map[j][l] ;
a[j] = a[i]^a[j] ;
}
}
for(i = 29 ; i >= 0 ; i--) {
for(j = i+1 ; j < 30 ; j++)
a[i] = a[i]^(ans[j]*Map[i][j]) ;
ans[i] = a[i] ;
}
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < 30 ; i++) {
if( ans[i] ) {
Map[ i/6 ][ i%6 ] = 1 ;
}
}
for(i = 0 ; i < 5 ; i++) {
for(j = 0 ; j < 5 ; j++)
printf("%d ", Map[i][j]) ;
printf("%d\n", Map[i][5]) ;
}
return ;
}
int main() {
int t , step = 0 ;
int i , j , k , x , y ;
scanf("%d", &t) ;
while( t-- ) {
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < 5 ; i++) {
for(j = 0 ; j < 6 ; j++) {
for(k = 0 ; k < 5 ; k++) {
x = i + s[k][0] ;
y = j + s[k][1] ;
if( x >= 0 && x < 5 && y >= 0 && y < 6 )
Map[x*6+y][i*6+j] = 1 ;
}
}
}
for(i = 0 ; i < 5 ; i++)
for(j = 0 ; j < 6 ; j++)
scanf("%d", &a[i*6+j]) ;
printf("PUZZLE #%d\n", ++step) ;
solve() ;
}
return 0 ;
}
相关文章推荐
- Meta标签中的apple-mobile-web-app-status-bar-style属性及含义
- CentOS7安装Hadoop2.7完整流程
- 可串行化隔离级别里的锁升级
- 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能
- 斐波那契前n位的和
- tk progressbar更新问题
- 进程的关系
- 进程的关系
- 各向异性扩散
- 完美素数 SDUT 3274
- 无序链表的顺序查找
- 优步联合有壹手快修发放福利---车内免费消毒
- 泛型中获取到Class
- 下一个社会 --- 德鲁克
- MariaDB的GTID复制和多源复制
- 8.1~8.2 周末翻倍奖励——滴滴快车单
- Java - IntelliJ IDEA 编辑注释模板
- CSS border三角、圆角图形生成技术简介
- 线程死锁
- 线程控制