只打了三个小时。
A. Broadcast Stations
B. Connect3
补题:zz
题解:因为格子是4*4的,而且每次落子的位置最多是只有四个,再加上剪枝,情况不会很多,直接爆搜就行了,再用三进制记录已经合法的情况,去掉重复的情况就行了。(用vs2017交会ac,但c++17会wa1,很奇怪)
//#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<math.h> #include<cmath> #include<time.h> #include<map> #include<set> #include<vector> #include<queue> #include<algorithm> #include<numeric> #include<stack> #include<bitset> #include<unordered_map> const int maxn = 0x3f3f3f3f; const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427; const double PI = 3.141592653589793238462643383279; //#ifdef TRUETRUE //#define gets gets_s //#endif using namespace std; int a, b; int ans; map<int, int>mp; bool Judge(int c[10][10], int aa, int bb, int pos) { if (aa == a && bb == b && pos == 1) { return false; } int cc[10][10], i, j; for (i = 1; i <= 4; i++) { for (j = 1; j <= 4; j++) { cc[i + 1][j + 1] = c[i][j]; } } aa++; bb++; bool flag = false; if (cc[aa][bb] == cc[aa - 1][bb] && cc[aa][bb] == cc[aa - 2][bb] || cc[aa][bb] == cc[aa + 1][bb] && cc[aa][bb] == cc[aa + 2][bb] || cc[aa][bb] == cc[aa][bb - 1] && cc[aa][bb] == cc[aa][bb - 2] || cc[aa][bb] == cc[aa][bb + 1] && cc[aa][bb] == cc[aa][bb + 2] || cc[aa][bb] == cc[aa + 1][bb + 1] && cc[aa][bb] == cc[aa + 2][bb + 2] || cc[aa][bb] == cc[aa - 1][bb - 1] && cc[aa][bb] == cc[aa - 2][bb - 2] || cc[aa][bb] == cc[aa - 1][bb] && cc[aa][bb] == cc[aa + 1][bb] || cc[aa][bb] == cc[aa][bb - 1] && cc[aa][bb] == cc[aa][bb + 1] || cc[aa][bb] == cc[aa - 1][bb - 1] && cc[aa][bb] == cc[aa + 1][bb + 1] || cc[aa][bb] == cc[aa - 1][bb + 1] && cc[aa][bb] == cc[aa - 2][bb + 2] || cc[aa][bb] == cc[aa + 1][bb - 1] && cc[aa][bb] == cc[aa + 2][bb - 2] || cc[aa][bb] == cc[aa - 1][bb + 1] && cc[aa][bb] == cc[aa + 1][bb - 1]) { flag = true; } if (flag && pos == 2 && aa - 1 == a && bb - 1 == b) { int tmp = 0; for (i = 1;i <= 4;i++) { for (j = 1;j <= 4;j++) { tmp *= 3; tmp += c[i][j]; } } if (!mp[tmp]) { ans++; mp[tmp] = 1; } return false; } if (flag || (!flag && aa - 1 == a && bb - 1 == b)) { return false; } else { return true; } } void f(int c[10][10], int d[10], int pos) { int i; for (i = 1; i <= 4; i++) { if (d[i] <= 4) { c[d[i]][i] = pos; int dd[10][10]; for (int ii = 1;ii <= 4;ii++) { memcpy(dd[ii], c[ii], sizeof(c[ii])); } if (Judge(dd, d[i], i, pos)) { d[i]++; f(dd, d, 3 - pos); d[i]--; } c[d[i]][i] = 0; } } } void init(void) { mp.clear(); } int main(void) { //ios::sync_with_stdio(false); int x; while (~scanf("%d %d %d", &x, &a, &b)) { init(); int c[10][10]; int d[10] = { 1,1,1,1,1,1,1,1,1,1 }; d[x]++; memset(c, 0, sizeof(c)); c[1][x] = 1; ans = 0; f(c, d, 2); printf("%d\n", ans); } return 0; }