P2040打开所有的灯

Posted 1129-tangqiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2040打开所有的灯相关的知识,希望对你有一定的参考价值。

例如

0  1  1
1  0  0
1  0  1

点一下最中间的灯【2,2】就变成了

0  0  1
0  1  1
1  1  1

再点一下左上角的灯【1,1】就变成了

1  1  1
1  1  1
1  1  1

达成目标。最少需要2步。

输出2即可。

输入输出格式

输入格式:

 

九个数字,3*3的格式输入,每两个数字中间只有一个空格,表示灯初始的开关状态。(0表示关,1表示开)

 

输出格式:

 

1个整数,表示最少打开所有灯所需要的步数。

 

输入输出样例

输入样例#1: 复制
0 1 1
1 0 0
1 0 1
输出样例#1: 复制
2
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[3] [3];
 4 int b[3][3];
 5 int ans=999999;
 6 int main(){
 7     for(int i=0;i<3;i++){
 8         for(int j=0;j<3;j++){
 9             cin>>a[i][j];
10         }
11     }
12     for(int x=0;x<(1<<9);x++){//枚举所有情况 
13         int cnt=0;
14         memset(b,0,sizeof(b));
15         for(int i=0;i<9;i++){
16             if((x>>i)&1==1){//枚举所有可以改变的地方
17                 cnt++;
18                 int p=i%3,q=i/3;
19                 b[p][q]^=1;
20                 if(p!=0)b[p-1][q]^=1;
21                 if(p!=2)b[p+1][q]^=1;
22                 if(q!=0)b[p][q-1]^=1;
23                 if(q!=2)b[p][q+1]^=1;
24             }
25         }
26         bool ok=true;
27         for(int i=0;i<3;i++){//比对改变之后是否可行
28             for(int j=0;j<3;j++){
29                 if((a[i][j]^b[i][j])==0){
30                     ok=false;
31                 }
32             }
33         }
34         if(ok==true){
35             ans=min(ans,cnt);
36         }
37     }
38     cout<<ans;
39 }

 

以上是关于P2040打开所有的灯的主要内容,如果未能解决你的问题,请参考以下文章

P2040打开所有的灯

Luogu2040 | 打开所有的灯 (广搜+状压)

开灯问题

开关灯

开灯问题--------《算法竞赛入门指导》P83

开灯问题-----00004