以前用pascal 写过的东西,这回是C++。明天去北校区给初中生讲N皇后,所以自己也熟悉一下呗! /* ID: wangqia6 TASK: checker LANG: C++ */ #include <fstream> #include <cstring> using namespace std; const int NEED = 3; ifstream infile; ofstream outfile; int n,now = 0,rec[15]; bool leftarr[30],rightarr[30],verarr[30]; long ans = 0; void dfsa(int i) { if (i > n) { now++; for (int j = 1; j < n; j++) outfile << rec[j] << ' '; outfile << rec[n] << endl; return; } for (int j = 1; j <= n; j++) if ( !verarr[j] && !leftarr[i + j] && !rightarr[i - j + n - 1]) { verarr[j] = true; leftarr[i + j] = true; rightarr[i - j + n - 1] = true; rec[i] = j; dfsa(i + 1); if (now == NEED) return; verarr[j] = false; leftarr[i + j] = false; rightarr[i - j + n - 1] = false; } return; } void worka() { memset(verarr,0,sizeof(verarr)); memset(leftarr,0,sizeof(leftarr)); memset(rightarr,0,sizeof(rightarr)); dfsa(1); return; } long lowbit(long x) { return x & -x; } void dfsb(int i, long verbit,long leftbit,long rightbit) { if (i > n) { ans++; return; } long k,tmp = verbit & leftbit & rightbit; while (tmp != 0) { k = lowbit(tmp); tmp -= k; verbit -= k; leftbit -= k; rightbit -= k; dfsb(i + 1,verbit,(leftbit << 1) + 1,(rightbit >> 1) + (1 << (n-1))); verbit += k; leftbit += k; rightbit += k; } return; } void workb() { dfsb(1,( 1 << n ) - 1,( 1 << n ) - 1,( 1 << n ) - 1); return; } int main() { infile.open("checker.in"); outfile.open("checker.out"); infile >> n; worka(); workb(); outfile << ans << endl; infile.close(); outfile.close(); return 0; }