利用《数据结构》课程知识完成C语言程序设计“N皇后问题”(堆栈,一维数组,普通算法都可以,用C语言写

一、课程设计的主要内容
【问题描述】
N皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
【基本要求】
1、直观的显示N皇后问题的每种摆放方式。
2、分别以两种方式显示程序的输出:①直接显示在运行窗口②保存在某文本文件中。
3、程序以菜单方式运行。
【测试数据】
分别取N=3,4,5和8

二、实验报告书
N皇后问题
一 目的

二 需求分析
1、名称
内容:分析题目,身体
2、名称
输入、输出
三 概要设计
1、名称
程序分成几个函数,包含几个子函数,子函数包含哪些功能
四 详细设计
1、名称
内容:流程图,某一个函数的流程图和代码,不能写太简单的那个
五 调试分析

六 测试结果
可以截图
七 用户使用说明

八 课程设计总结

谢谢您了,最迟不能超过10月22日,太感谢了,急用麻烦了
每一行都做上注释可以吗,麻烦了

#include <stdio.h>//N皇后问题

#include <
stdlib.h
>

#include <stdio.h>


#include <
iostream.h
>


#include <
time.h
>

#include <dos.h>

#include<malloc.h>

typedef struct {

int *elem;

int length;

int listsize;

}Sqlist;

int InitList(Sqlist & L){//初始化

L.elem=(int *)malloc(100*sizeof(int));

if(!L.elem)

return 0;

L.length=0;

L.listsize=100;

return 1;

}


int Insert(Sqlist & L,int e){//插入

int m=0,i=0; 

int *p=&L.elem[0],*j=&L.elem[0];

if(L.length==0)

{ *p=e; L.length++;return 1;}

for(i;i<L.length;i++)

if(e>=*(p+i))

m=i+1;

for(i=L.length;i>m;i--)

*(j+i)=*(j+i-1);

L.elem[m]=e;

L.length++;

return 1;

}


void Print(Sqlist &L,int n){//
遍历
打印输出

int k=1,i=0; int*p=&L.elem[0];

for(i=0;i<n*n;i++,k++){

printf("%d ",*(p+i));

if(k==n){k=0;printf("\n");}}

printf("\n\n\n\n\n\n\n");

}


int ReturnK(Sqlist &L,int k){//返回第K个元素的值

int*p=&L.elem[0];

return *(p+k-1); 

}


void FuK(Sqlist &L,int k,int e){//将第k个元素赋值为e

int *p=&L.elem[0];

*(p+k-1)=e;

}


int TiaoJian(Sqlist L,int n,int &e){//是否满足皇后问题判断

int b[100];

int m=0,h=2*n;

for(int k=0;k<2*n;k++) b[k]=0; 

for(int i=1;i<=n*n;i++)

if(ReturnK(L,i)==1)

{b[m]=(i-1)/n+1;m++;b[m]=i-(b[m-1]-1)*n;m++;}

for(int c=0;c<2*n;c++)

if(b[c]==0) {h=c;break;} 

for( c=0;c<h-2;c=c+2)

for(int d=c+2;d<h;d=d+2)

if(b[c]==b[d]||b[c+1]==b[d+1]||b[d+1]-b[c+1]==b[d]-b[c]||b[d+1]-b[c+1]==b[c]-b[d])

return 0;

if(h==2*n){

printf("\n\n%d皇后问题第%d个排列!\n\n",n,e);e++;

}

return 1; 

}

void Trial(Sqlist &L,int i,int n,int &e){//皇后问题

int j;

if(i>n){Print(L,n);}

else for(j=1;j<=n;j++){

FuK(L,n*i-n+j,1);

if(TiaoJian(L,n,e)==1)

Trial(L,i+1,n,e);

FuK(L,n*i-n+j,0);

}

}

void main(){

int k,i=0; 

printf("\n\n请输入要n皇后问题个数:\n");

scanf("%d",&k);

time_t rawtime;

struct tm
* timeinfo;

time ( &rawtime );

timeinfo = localtime ( &rawtime );


Sqlist L1;

InitList(L1); 

for(i=0;i<k*k;i++)

Insert(L1,0);

int e=1;

Trial(L1,1,k,e);

printf ( "The current date/time is: %s", asctime (timeinfo) );

time ( &rawtime );

timeinfo = localtime ( &rawtime );

printf ( "The current date/time is: %s", asctime (timeinfo) );


printf("哈哈哈哈\(^o^)/~\n");

system("pause");


}

追问

谢谢亲,这个程序有很多小错误啊,亲能否调试后无错误再发一遍呢,谢谢了

追答

恩。好的。

不过这次我发代码,百度提示说内容太长,发不了,我就说吧,改哪些

头文件发上去百度给我排版乱了,头文件改成下面这样

#include <stdio.h>//N皇后问题 

#include <stdlib.h >  

#include <stdio.h> 

#include <iostream>  

#include <time.h >   

#include <dos.h>  

#include<malloc.h>
还有函数后面的注释也是的,排版给排到下一行了,你把void Print(Sqlist &L,int n)后面的注释改一下
还有这个函数int TiaoJian(Sqlist L,int n,int &e)里面的第四个for循环里的变量c没定义,for( c=0;c<h-2;c=c+2)改成for(int c=0;c<h-2;c=c+2)

追问

亲,能否给每一行都标个注释吗,基础薄弱啊,每一行都是什么意思,定义的什么能写一下吗,谢谢了,最好写成word发到我的

麻烦了

追答

恩,明天我休息一天,后天帮你做word吧,反正你现在不急着要吧

追问

亲,我知道我这么问您真的很麻烦您,我是说麻烦您帮我写一下程序里面每一行都是什么意思啦,真的真的太感谢了,我需要去找老师讲给她听,她要提问的,所以你懂得,麻烦您帮我写一下可以吗,我一定采纳您的,太感谢了,麻烦您这么多

追答

已经发了,请查收一下qq邮箱,如果有问题可以加我qq843094182,一起讨论哈

温馨提示:答案为网友推荐,仅供参考
相似回答