据此我们可以写出代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int resu[92][8], mark[9]; int rang[9], line_45[17], line_135[17]; int count=0; void f(int i) { int j; if(i > 8) { // 得到一组新解 for(j=0; j < 8; j++) resu[count][j] = mark[j+1]; count++; } // 每次均从小到大遍历,保证最后的结果序列是有序的 for(j=1; j < 9; j++) { if(rang[j] && line_45[i+j] && line_135[j+9-i]) { mark[i] = j; rang[j] = line_45[i+j] = line_135[j+9-i] = 0; f(i+1); rang[j] = line_45[i+j] = line_135[j+9-i] = 1; } } } int main() { int nCase, number, i; memset(rang, 1, sizeof(rang)); memset(line_45, 1, sizeof(line_45)); memset(line_135, 1 , sizeof(line_135)); scanf("%d", &nCase); f(1); while(nCase-- > 0) { scanf("%d", &number); for(i=0; i < 8; i++) printf("%d", resu[number-1][i]); printf("\n"); } return 0; }