NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

打表代码:

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int firstLine[30]; //第一行的情况,0表示+,1表示- 
 6 int ans[30]; //记录结果 
 7 
 8 int count(int n) { //计算第一行为n的三角形一共有几个符号 
 9     return (n + 1) * n / 2;
10 }
11 
12 void dfs(int n, int m) { //m表示当前遍历到第m个数 
13     if (n >= m) {
14         firstLine[m] = 0;
15         dfs(n, m + 1);
16         firstLine[m] = 1;
17         dfs(n, m + 1);
18         return;
19     }
20     
21     int tmp[30]; //临时记录每一行的情况 
22     
23     int sum = 0;
24     
25     for (int i = 1; i <= n; i++) {
26         tmp[i] = firstLine[i];
27         sum += tmp[i];
28     }
29     
30     for (int i = 2; i <= n; i++) 
31         for (int j = 1; j <= n - i + 1; j++) {
32             tmp[j] = tmp[j] ^ tmp[j + 1];
33             sum += tmp[j];
34         }
35         
36     if (sum == count(n) / 2)
37         ans[n]++;
38 }
39 
40 
41 int main() {
42     memset(ans, 0, sizeof(ans));
43     for (int i = 1; i <= 24; i++) {
44         dfs(i, 1);
45         cout << ans[i] << endl;
46     }
47 }

 

提交代码:

1 #include<iostream>
2 using namespace std;
3 
4 int ans[25] = { 0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229 };
5 int main() {
6     int n;
7     while (cin >> n&&n)
8         cout << n << " " << ans[n] << endl;
9 }

 

posted on 2017-03-21 19:21  NWU_ACM  阅读(153)  评论(0编辑  收藏  举报