sgu-260 Puzzle
2015-06-01 19:48
375 查看
题目大意:
给你一个0101串,长度为N(N<=200)N(N<=200),每一位不但能控制自己,还可以控制别的一些位,现在有反转操作,假设我们对第ii位执行反转操作,那么ii所控制的所有位都会反转。现在给你每位控制的集合,和初始0101串,问是否存在一种操作方式使得这个串都为00或11。解题思路:
直接高斯消元就行了。没什么可说的。
AC代码:
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> using namespace std; int fc_[300][300]={{0}}; int fc[300][300]={{0}}; int prt[300]={0}; int N; bool Gauss() { memcpy(fc,fc_,sizeof(fc)); int remain=1; for(int cnt=1;cnt<=N && remain<=N;cnt++) { int g; for(g=remain;g<=N;g++) { if(fc[g][cnt]!=0) break; } if(g==N+1) continue; for(int i=0;i<=N;i++) swap(fc[g][i],fc[remain][i]); for(int i=1;i<=N;i++) { if(i==remain || fc[i][cnt]==0) continue; for(int j=0;j<=N;j++) fc[i][j]^=fc[remain][j]; } remain++; } for(int i=remain;i<=N;i++) if(fc[i][0]==1) return false; int ans=0; for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { if(fc[i][j]==1 && fc[i][0]==1) { ans++; prt[j]=1; break; } } } printf("%d\n",ans); for(int i=1;i<=N;i++) if(prt[i]==1) printf("%d ",i); printf("\n"); return true; } int main() { scanf("%d",&N); for(int i=1;i<=N;i++) { int j; scanf("%d",&j); for(;j>0;j--) { int p; scanf("%d",&p); fc_[p][i]=1; } } for(int i=1;i<=N;i++) scanf("%d",&fc_[i][0]); if(Gauss()) return 0; for(int i=1;i<=N;i++) fc_[i][0]^=1; if(Gauss()) return 0; printf("-1\n"); return 0; }
相关文章推荐
- Android:长按连续响应的Button
- js类型检测
- 指针与引用
- centos 7 virtualbox guest additions installation centos minimal
- 读写xml文件
- MCV分页实现
- 第五十九天 how can I 坚持 --------补昨天5月31号
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(3)
- VirtualBox Guest Additions on Fedora 21/20, CentOS/RHEL 7.1/6.6/5.11
- 会员卡管理系统技术解析(七)会员卡挂失记录查询
- POJ 2002 几何+hash
- Android ListView嵌套
- 关于操作系统
- sgu245:Black-White Army(技巧暴力)
- 凯云水利水电工程造价系统 (四) 配合比单价模块
- EXCEL: 数字格式不一样导致VLOOKUP无法正常使用
- Spring MVC的@ResponseBody返回JSON串时Content-Type编码问题
- Android---手动创建线程与GUI线程同步(二)
- Linux--YUM 安装 nginx php mysql
- C#第五次作业:开源项目“网页正文提取”的理解