样例输出
1586372484136275
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int n; char s[93][9]; int matrix[9][9]; int idd=0; int check(int x,int y) { for(int i=1;i<x;++i) { if(matrix[i][y]==1) return 0; //同列有皇后,不能放,除此之外,我们是逐行放置的,所以肯定不同行,所以不需要进行测试 for(int j=1;j<=8;++j) { if(matrix[i][j]==1&&abs(i-x)==abs(j-y))//测试之前行号是否有对角线的皇后 return 0; } } return 1; } int dfs(int row) { if(row==9) { char str[9]; for(int i=1;i<=8;i++) for(int j=1;j<=8;++j) { if(matrix[i][j]==1) str[i-1]="012345678"[j]; } strcpy(s[idd++],str); } else { for(int j=1;j<=8;++j) { if(check(row,j)) //直接测试是否能放 { matrix[row][j]=1; dfs(row+1); matrix[row][j]=0; } } } } int main(int argc, char *argv[]) { scanf("%d",&n); dfs(1); for(int i=0;i<n;++i) { int t; scanf("%d",&t); printf("%s\n",s[t-1]); } return 0; }
原文地址:http://blog.csdn.net/wdkirchhoff/article/details/41548193