您的位置:首页 > 编程语言 > C语言/C++

C语言实现N皇后问题源代码

2009-04-11 08:26 323 查看
*********************以下程序经本人在TC下编译通过***********************

#include<stdio.h>

#include<alloc.h>

void pr();

void init();

void clean();

int setT(int i,int j);

int setX(int i,int j);

int find(int i,int j,int qNum);

void wr();

int n,count=0;

char **queen;

FILE *f;

void main(){

clrscr();

init();

clean();

f=fopen("answer.txt","wt");

find(0,0,0);

printf("/ncount=%d",count);

fprintf(f,"/ncount=%d",count);

fclose(f);

getch();

}

void pr(){

int x,y;

printf("/n-------------------------------------/n");

for(x=0;x<n;x++){

for(y=0;y<n;y++)

printf("%c
",queen[x][y]);

printf("/n");

}

printf("/n-------------------------------------/n");

}

void init(){

int j;

printf("input n(n>0):");

scanf("%d",&n);

while(n<=0){

printf("input
n(n>0):");

scanf("%d",&n);

}

queen=(char**)malloc(sizeof(char*)*n);

for(j=0;j<n;j++)

queen[j]=(char*)malloc(sizeof(char)*n);

}

void clean(){

int x,y;

for(x=0;x<n;x++)

for(y=0;y<n;y++)

queen[x][y]='o';

}

int setT(int i,int j){

int x;

for(x=0;x<n;x++){

if(queen[i][x]=='*')return
0;

if(queen[x][j]=='*')return
0;

}

return 1;

}

int setX(int i,int j){

int x=i,y=j;

do{

if(queen[x++][y++]=='*')return
0;

}while(x!=n&&y!=n);

x=i;

y=j;

do{

if(queen[x--][y--]=='*')return
0;

}while(x!=-1&&y!=-1);

x=i;

y=j;

do{

if(queen[x++][y--]=='*')return
0;

}while(x!=n&&y!=-1);

x=i;

y=j;

do{

if(queen[x--][y++]=='*')return
0;

}while(x!=-1&&y!=n);

return 1;

}

int find(int i,int j,int qNum){

for(;i<n;i++){

for(;j<n;j++){

if((setT(i,j)==1)&&(setX(i,j)==1)){

queen[i][j]='*';

qNum++;

if(qNum==n){

count++;

wr();

queen[i][j]='o';

return
1;

}

find(i,j+1,qNum);

queen[i][j]='o';

qNum--;

}

}

j=0;

}

return 0;

}

void wr(){

int x,y;

fprintf(f,"/n-------------------------------------/n
count=%d/n/n",count);

for(x=0;x<n;x++){

for(y=0;y<n;y++){

fprintf(f,"%c
",queen[x][y]);

}

fprintf(f,"/n");

}

fprintf(f,"/n-------------------------------------/n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: