样例输出
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