vijosP1016 北京2008的挂钟

vijosP1016 北京2008的挂钟

 

题目链接:https://vijos.org/p/1016

 

【思路】

  Dfs。

  对操作搜索更加优秀,所以采用搜索每一个操作的使用次数,因为操作数为4则相当于没有操作,所以枚举上限为3。

 

【代码】

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int op[9][9]={ {1,1,0,1,1,0,0,0,0},
 7                {1,1,1,0,0,0,0,0,0},
 8                {0,1,1,0,1,1,0,0,0},
 9                {1,0,0,1,0,0,1,0,0},
10                {0,1,0,1,1,1,0,1,0},
11                {0,0,1,0,0,1,0,0,1},
12                {0,0,0,1,1,0,1,1,0},
13                {0,0,0,0,0,0,1,1,1},
14                {0,0,0,0,1,1,0,1,1}  };
15 const int maxn = 10;
16 int cnt[maxn],a[maxn],tmp[maxn];
17 
18 void dfs(int d) {
19     memcpy(&tmp,&a,sizeof(a));
20     
21     for(int i=0;i<9;i++)
22         for(int j=0;j<9;j++)
23         {
24            tmp[i]=(tmp[i]+op[j][i]*cnt[j])%4;
25         }
26     bool f=true;
27     for(int i=0;i<9;i++) if(tmp[i]) {f=false; break; }
28     if(f) {
29         for(int i=0;i<9;i++)  //9
30            for(int j=0;j<cnt[i];j++)
31               cout<<i+1<<" ";
32         exit(0);
33     }
34     if(d==9) return ;
35     
36     for(int i=0;i<4;i++) {
37         cnt[d]=i;
38         dfs(d+1);
39     }
40 }
41 
42 int main() {
43     ios::sync_with_stdio(false);
44     for(int i=0;i<9;i++) cin>>a[i];
45     
46     dfs(0);
47     
48     return 0;
49 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值