涂抹果酱

Posted wsy107316

tags:

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

涂抹果酱

技术图片

 

 技术图片

 

 题目分析:这道题跟上一道题有点像,不过这题有三种,所以想到三进制,而不是二进制了,然后把1,2,3化成0,1,2;然后,相应的比较部分换一下就好了

AC_Code:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod = 1e6;
 5 const int maxn = 1e4 + 10;
 6 
 7 int n, m, k;
 8 int maxx, tot, sta[250], zk, pos, ans;
 9 int f[10100][250];
10 
11 bool check(int x) {
12     int tmp = 0x3f;
13     for (int i = 1; i <= m; i++) {
14         if (tmp == x % 3)
15             return false;
16         tmp = x % 3;
17         x /= 3;
18     }
19     return true;
20 }
21 
22 bool judge(int u, int v) {
23     for (int i = 1; i <= m; i++) {
24         if (u % 3 == v % 3)
25             return false;
26         u /= 3;
27         v /= 3;
28     }
29     return true;
30 }
31 
32 int qpow(int a, int b) {
33     int res = 1;
34     while (b) {
35         if (b & 1)
36             res *= a;
37         a *= a;
38         b >>= 1;
39     }
40     return res;
41 }
42 
43 int main() {
44     ios::sync_with_stdio(false);
45     cin >> n >> m >> k;
46     for (int i = 1; i <= m; i++) {
47         int x;
48         cin >> x;
49         zk = zk * 3 + (x - 1);
50     }
51 
52     maxx = qpow(3, m);
53     for (int i = 0; i < maxx; i++) {
54         if (check(i))
55             sta[++tot] = i;
56     }
57     for (int i = 1; i <= tot; i++) {
58         if (zk == sta[i]) {
59             pos = i;
60             break;
61         }
62     }
63     if (!pos) {  //第k行本身就不符合条件
64         cout << "0" << 
;
65         return 0;
66     }
67     for (int i = 1; i <= n; i++) {
68         if (i == k) {  //此行状态已经固定
69             if (i == 1)
70                 f[i][pos] = 1;
71             else {
72                 for (int j = 1; j <= tot; j++) {
73                     if (judge(sta[pos], sta[j])) {
74                         f[i][pos] = (f[i][pos] + f[i - 1][j]) % mod;
75                     }
76                 }
77             }
78         } else {
79             for (int j = 1; j <= tot; j++) {  //此行状态没有固定,所以多一重循环
80                 if (i == 1)
81                     f[i][j] = 1;
82                 else {
83                     for (int k = 1; k <= tot; k++) {
84                         if (judge(sta[k], sta[j])) {
85                             f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
86                         }
87                     }
88                 }
89             }
90         }
91     }
92     for (int i = 1; i <= tot; i++) ans = (ans + f[n][i]) % mod;
93     cout << ans << 
;
94     return 0;
95 }

 

以上是关于涂抹果酱的主要内容,如果未能解决你的问题,请参考以下文章

#10172. 「一本通 5.4 练习 1」涂抹果酱 题解

涂抹果酱

「一本通 5.4 练习 1」涂抹果酱

三进制状压(涂抹果酱)

2019.9.1 涂抹果酱

使用 OpenCV 进行图像检测