c语言N皇问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 04:10:52
//col [n] :col[i] 标识第 i 列是否安放了皇后
//md[2n-1] : md[k] 标识第 k 条主对角线是否安放了皇后
//sd[2n-1] : sd[k] 标识第 k 条次对角线是否安放了皇后
//g[n] : g[i] 记录第 i 行皇后在第几列

#include<stdio.h>
int j;
int col[4]={0};
int md[7]={0};
int sd[7]={0};
int g[4]={0};

void queen( int i )
{

for ( j = 1; j <= 4; j++ )
{
if ( !col[j] && !md[4+i-j] &&
!sd[i+j-1] )
{
/*第 i 行第 j 列没有攻击 */
col[j] = md[4+i-j] = sd[i+j-1] = 1;
g[i] = j;
/*在第 i 行第 j 列安放皇后*/
if ( i == 4 )
{ /*输出一个布局*/
for ( j = 0; j <= 4; j++ )
printf("%d ",g[j]);

}
else
queen ( i+1 );
}
col[j] = md[4+i-j] = sd[i+j-1] = 0;
g[i] = 0; /*撤消第i行第j列的皇后*/
}
}

void main(){
queen(1);
}

#include<stdio.h>
#include<stdlib.h>

#define NQUEEN 9 //总共多少行
int col[NQUEEN]={0},iTotalM=0;
//你的写法太麻烦了 用不到那么多变量

void queen( int iLine )
{
if (iLine<NQUEEN) {
int j,k;
for(j=0;j<NQUEEN;++j) {//本行的皇后的投放位置
for(k=0;k<iLine;++k) {//检测可行性
if (col[k]==j) break;
if (abs(iLine-k)==abs(col[k]-j)) break;
}

if (k==iLine) {//通过检测 可以递归到下一层了
col[iLine]=j;
queen(iLine+1);
}
}
}else{
//可以输出了
int x,y;
printf("No: %d\n",iTotalM);
iTotalM++;
for(x=0;x<NQUEEN;x++) {printf("%2d",x);}
printf("\n");
for(y=0;y<iLine;++y) {
for(x=0;x<col[y];x++) {printf("._");}
printf("[]");
for(x=1;x<NQUEEN-col[y];x++) {printf("._");}
printf("\n");
}
//getchar();