//DFS递归解 #include #include using namespace std; int record[93][9]; int x[9]; int index; bool OK(int col, int line) { for(int i = 1; i < line; ++i) if(abs(i - line) == abs(x[i]- col) || x[i] == col) return false; return true; } void DFS(int line) { if(line > 8) { index++; for(int i = 1;i <= 8; ++i) record[index][i] = x[i]; } else { for(int col = 1; col <= 8; ++col) { if(OK(col, line)) { x[line] = i; DFS(line+1); } } } } //回溯法栈解 int main() { DFS(1); int n; scanf(“%d”, &n); while(n—) { int order; scanf(“%d”, &order); for(int i = 1; i <= 8; ++i) printf(“%d”, record[order][i]); printf(“/n”); } return 0; } #include #include using namespace std; int record[93][9]; int s[9]; int index; bool OK(int line) { for(int i = 1; i < line; ++i) if(abs(i - line) == abs(s[i] - s[line]) || s[line] == s[i]) return false; return true; } void backTrack(int line) { for(int i= 1;i <= 8; ++i) s[i] = 0; int top = 1; while(top != 0) { s[top]++; while(s[top] <= 8 && !OK(top)) s[top]++; if(s[top] > 8) { s[top] = 0; —top; } else // s[top] <= 8 { if(top == 8) { index++; for(int i = 1;i <= 8; ++i) record[index][i] = s[i]; } else top++; } } } int main() { backTrack(1); int n; scanf(“%d”, &n); while(n—) { int order; scanf(“%d”, &order); for(int i = 1; i <= 8; ++i) printf(“%d”, record[order][i]); printf(“/n”); } return 0; }
还没有评论,来说两句吧...