打表代码:
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 }