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");
}
#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");
}
相关文章推荐
- [算法]经典算法8皇后(N皇后)问题的解法,C语言实现
- N 皇后问题C语言实现
- C语言实现各大皇后问题
- 八皇后问题,C语言实现,求出第一行第一列有皇后的解
- n皇后问题的两种递归方法C语言实现
- C语言实现迷宫求解问题(附源代码)
- 迷宫问题的通用解法C语言数据结构实现
- 回溯法求解 “n 皇后 问题”——Java 实现
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- n皇后问题的非递归迭代算法(C++实现)
- c语言dfs解决n皇后问题
- O(NlgK)问题优先队列实现文件C语言
- 详解约瑟夫环问题及其相关的C语言算法实现
- 『每日一题 2012-02-10』猴子选大王问题 C语言实现
- 找零钱问题(C语言实现)——贪心算法应用(1)
- 关于C语言实现兑换钱的问题
- C语言实现的排列组合问题的通用算法、解决方法
- C语言实现之牛的数量(细胞分裂问题)(利用树实现)
- 八皇后问题的递归算法和非递归算法实现
- 赛码网,股神问题,用C语言自己实现的一个程序,仅供参考