N皇后与凸多边形C语言设计流程思路与源代码.docx
- 文档编号:27337439
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:25
- 大小:592.94KB
N皇后与凸多边形C语言设计流程思路与源代码.docx
《N皇后与凸多边形C语言设计流程思路与源代码.docx》由会员分享,可在线阅读,更多相关《N皇后与凸多边形C语言设计流程思路与源代码.docx(25页珍藏版)》请在冰豆网上搜索。
N皇后与凸多边形C语言设计流程思路与源代码
成绩管理程序设计报告
(凸多边形)
一、问题描述
输入N个点的坐标,判断这N个点能否构成一个凸多边形。
二、结构图
三、数据结构的设计
intpolygon(pointsnps)
{
doublevar1,var2;
inti,j,k;
if(nps.pointNum<3)return0;/*如果多边形的顶点数小于3,返回0*/
for(i=0;i { j=(i+2)%nps.pointNum; k=(i+1)%nps.pointNum; var1=(nps.x[i]-nps.x[k])*(nps.y[i]-nps.y[j])-(nps.y[i]-nps.y[k])*(nps.x[i]-nps.x[j]); for(j=(j+1)%nps.pointNum;j! =i;j=(j+1)%nps.pointNum) { var2=(nps.x[i]-nps.x[k])*(nps.y[i]-nps.y[j])-(nps.y[i]-nps.y[k])*(nps.x[i]-nps.x[j]); if(var1*var2<0)return0;/*有则返回0,表示不能构成凸多边形*/ if(var2! =0)var1=var2; } if(var1==0)return0; } return1;/*没有则返回1,表示能构成凸多边形*/ } 四、处理流程图: 五、源程序 #include #include #defineN100/*定义一个字符常量*/ typedefstruct{/*定义一个新的数据类型*/ doublex[N]; doubley[N]; intpointNum; }points; intpolygon(pointsnps) { doublevar1,var2; inti,j,k; if(nps.pointNum<3)return0;/*如果多边形的顶点数小于3,返回0*/ for(i=0;i { j=(i+2)%nps.pointNum; k=(i+1)%nps.pointNum; var1=(nps.x[i]-nps.x[k])*(nps.y[i]-nps.y[j])-(nps.y[i]-nps.y[k])*(nps.x[i]-nps.x[j]); for(j=(j+1)%nps.pointNum;j! =i;j=(j+1)%nps.pointNum) { var2=(nps.x[i]-nps.x[k])*(nps.y[i]-nps.y[j])-(nps.y[i]-nps.y[k])*(nps.x[i]-nps.x[j]); if(var1*var2<0)return0;/*有则返回0,表示不能构成凸多边形*/ if(var2! =0)var1=var2; } if(var1==0)return0; } return1;/*没有则返回1,表示能构成凸多边形*/ } main() { inti; pointsnps; printf("请输入顶点的个数: "); scanf("%d",&nps.pointNum); printf("请输入这些顶点的坐标,每个点的横坐标和纵坐标用逗号分隔开(例如12.5,34): \n"); for(i=0;i { printf("第%d个顶点: ",i+1); scanf("%lf,%lf",&nps.x[i],&nps.y[i]); } if(polygon(nps))/*根据子函数的返回值输出结果*/ printf("该多边形是凸多边形。 \n"); else printf("该多边形不是凸多边形! ! ! \n"); } 七、程序测试记录: 第一次: 请输入顶点的个数: 第二次: 请输入顶点的个数: 5 请输入这些顶点的坐标,每个点的横坐标和纵坐标用逗号分隔开(例如12.5,34): 第1个顶点: 1,1 第2个顶点: 1,4 第3个顶点: 5,1 第4个顶点: 5,4 第5个顶点: 3,3 该多边形不是凸多边形! ! ! Pressanykeytocontunue 第三次: 请输入顶点的个数: 3 请输入这些顶点的坐标,每个点的横坐标和纵坐标用逗号分隔开(例如12.5,34): 第1个顶点: 1,1 第2个顶点: 3,2 第3个顶点: 2,1 该多边形是凸多边形。 Pressanykeytocontunue 第四次: 请输入顶点的个数: 2 请输入这些顶点的坐标,每个点的横坐标和纵坐标用逗号分隔开(例如12.5,34): 第1个顶点: 2,1 第2个顶点: 5,1 该多边形不是凸多边形! ! ! Pressanykeytocontunue 八、相关运行界面 九、调试记录: 1、在开始时中未对顶点数大于3和小于3分开处理。 在顶点数小于3时处, 无法构成三角,程序出现混乱。 2、在要求分数输入时,刚开始没注意应控制在输入时只能为数字,结果输入了字符或运算符没错,这与实际不符。 十、软件说明: 1、本程序可基本判断是否为凸多边形 2、由于数据较少,所以没有针对数据的存储和释放做过多准备 (N皇后) 一、问题描述 由n2个方块排成n行n列的正方形称为“n元棋盘”。 如果两个皇后位于n元棋盘上的同一行或同一列或同一对角线上,则称它们为互相攻击。 要求输出使n无棋盘上的n个皇后互不攻击的所有布局。 具体要求如下; (1)n可由键盘输入。 (2)在输入n后,动态建立方法说明中所需要建立的数组空间;程序运行结束时释放该存储空间。 (3)分别用n=4,5,6运行你的程序。 二、结构图 空间管理 三、数据结构的设计 intSUM=0;//统计有多少种可能 intshezhi(){//设置为N皇后问题 intN; printf("这是一个N皇后问题...\n请输入N="); scanf("%d",&N); returnN; } voidPrint(intN,intx[])//印出結果 {intMAX=N; for(inti=0;i {for(intj=0;j if(j==x[i]) printf("●"); else printf("○"); printf("\n"); } SUM++;//打印一种情况统计一次 printf("\n"); } intJudge(intk,intx[])//判断是否在同一直、橫、斜线上有其它棋子 {inti; for(i=0;i if(abs(k-i)==abs(x[i]-x[k])||x[i]==x[k])//函数名: abs;功能: 求整数的绝对值; return0; return1; } voidbacktrack(intt,intN,intx[])//把棋子放到棋盘上 {intMAX=N; inti; for(i=0;i x[t]=i; if(Judge(t,x)) {if(t==MAX-1){ Print(MAX,x);//找到其中一种放法,印出結果 } elsebacktrack(t+1,N,x); } } } 四、处理流程图: 递归尝试第i+1行的摆放位置 打印所有皇后的摆放位置 否 是 回溯,撤销占据位置(i,j) j++ i 在(i,j)位置摆放皇后 宣布占据(i,j)位置 (i,j)位置是否被占据 否 是 是 j j=0 循环终止 否 输入N 五、源程序 #include #include #include #include #include intSUM=0;//统计有多少种可能 intshezhi(){//设置为N皇后问题 intN; printf("这是一个N皇后问题...\n请输入N="); scanf("%d",&N); returnN; } voidPrint(intN,intx[])//印出結果 { intMAX=N; for(inti=0;i { for(intj=0;j if(j==x[i]) printf("●"); else printf("○"); printf("\n"); } SUM++;//打印一种情况统计一次 printf("\n"); } intJudge(intk,intx[])//判断是否在同一直、橫、斜线上有其它棋子 { inti; for(i=0;i if(abs(k-i)==abs(x[i]-x[k])||x[i]==x[k])//函数名: abs;功能: 求整数的绝对值; return0; return1; } voidbacktrack(intt,intN,intx[])//把棋子放到棋盘上 {intMAX=N; inti; for(i=0;i x[t]=i; if(Judge(t,x)) { if(t==MAX-1){ Print(MAX,x);//找到其中一种放法,印出結果 } elsebacktrack(t+1,N,x); } } } voidIntroduce(){ printf("******************\n"); printf("1.设置为N皇后问题。 \n"); printf("2.输出棋局排布结果。 \n"); printf("3.统计棋局排布总数。 \n"); printf("4.清屏。 \n"); printf("\n\n"); } voidmain() {intN; intx[10]; printf("\n\n\n"); charflag=1; while(flag){ intn; Introduce(); chara; printf("您确定要进行上述操作吗? (Y/N): "); a=getchar(); while(a=='Y'||a=='y'){ printf("请选择: "); scanf("%d",&n); switch(n){ case1: N=shezhi(); break; case2: backtrack(0,N,x); printf("按任意键返回..."); getch(); system("cls"); Introduce(); break; case3: printf("统计结果: %d\n",SUM); printf("按任意键返回..."); getch(); system("cls"); Introduce(); break; case4: printf("按任意键返回..."); getch(); system("cls"); Introduce(); break; default: printf("输入错误...\n"); printf("按任意键返回..."); getch(); system("cls"); Introduce(); break; } } } } 七、程序测试记录: 第一次 1.设置为N皇后问题。 2.输出棋局排布结果。 3.统计棋局排布总数。 4.清屏。 您确定要进行上述操作吗? (Y/N): 第二次 1.设置为N皇后问题。 2.输出棋局排布结果。 3.统计棋局排布总数。 4.清屏。 您确定要进行上述操作吗? (Y/N): y 请选择: 1 这是一个N皇后问题... N=4 请选择: 2 ○●○○ ○○○● ●○○○ ○○●○ ○○●○ ●○○○ ○○○● ○●○○ 第三次 1.设置为N皇后问题。 2.输出棋局排布结果。 3.统计棋局排布总数。 4.清屏。 您确定要进行上述操作吗? (Y/N): y 请选择: 1 这是一个N皇后问题... N=5 请选择: 2 ●○○○○ ○○●○○ ○○○○● ○●○○○ ○○○●○ ●○○○○ ○○○●○ ○●○○○ ○○○○● ○○●○○ ○●○○○ ○○○●○ ●○○○○ ○○●○○ ○○○○● ○●○○○ ○○○○● ○○●○○ ●○○○○ ○○○●○ ○○●○○ ●○○○○ ○○○●○ ○●○○○ ○○○○● ○○●○○ ○○○○● ○●○○○ ○○○●○ ●○○○○ ○○○●○ ●○○○○ ○○●○○ ○○○○● ○●○○○ ○○○●○ ○●○○○ ○○○○● ○○●○○ ●○○○○ ○○○○● ○○●○○ ●○○○○ ○○○●○ ○●○○○ 第四次 1.设置为N皇后问题。 2.输出棋局排布结果。 3.统计棋局排布总数。 4.清屏。 您确定要进行上述操作吗? (Y/N): y 请选择: 1 这是一个N皇后问题... N=6 请选择: 3 统计结果: 12 第五次 1.设置为N皇后问题。 2.输出棋局排布结果。 3.统计棋局排布总数。 4.清屏。 您确定要进行上述操作吗? (Y/N): y 请选择: 1 这是一个N皇后问题... N=6 请选择: 2 ○●○○○○ ○○○●○○ ○○○○○● ●○○○○○ ○○●○○○ ○○○○●○ ●○○○○○ ○○●○○○ ○○○○●○ ○●○○○○ ○○○●○○ ○○○○○● ○○○●○○ ○○○○○● ●○○○○○ ○○●○○○ ○○○○●○ ○●○○○○ 等等。 。 。 。 。 。 。 八、相关运行界面 九、调试记录: 函数对每一个已经放好的皇后的位置进行判断,所以就要有个循环。 用递归来解决问题并这个问题分成一个个相同的小问题来实现。 建一个可以放好一行的函数backtrack(intt)里面的t表示是第几行,在main函数调用的时候第一次传进来的是0也就是从第一行开始判断。 我们就开始写函数体 循环里面我们让x[t]=i也就是从这一行的第一个开始判断。 放好后就要去判断是否符合条件。 如果符合条件我们就在调用这个函数本身backtrack不过传进去的参数是t+1也就是下一行的意思。 在进行判断下一行之前我们要判断一下t是不是等于8也就是已经是最后一行了,如果是最后一行了我们就可以将其进行输出。 打印8*8的矩阵(提示在写一个函数)皇后的位置用1表示出来没有的用0表示。 十、软件说明: 1.解决八皇后问题根本(递归法) 2.可上升为解决“N皇后问题” 3.以直观形式输出棋局排布 4.统计棋子排布方法总数 5.清屏函数的调用 十一、课程设计总结: 这次的设计课是人生一次真正的自己动手的程序设计! 自己发现问题、解决问题,其中不仅对C和C++的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。 本次我做的是“N皇后问题”,这是一个历史经典问题,经过资料查找,我发现关于八皇后问题的算法甚多,比如: 回溯法,迭代法,递归法,残卷法等。 经过思考,最后我决定使用递归的方法解决该问题。 虽然我遇到了很多问题,但是经过资料查找,和网上提问,我们最终解决了问题。 总的来说,这个程序虽不是十分复杂但也有许多要思考的地方,不但对一些基本的语法进一步的熟悉掌握了而且还有了新的体会,两个星期的努力还是换来了不少的收获!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 皇后 凸多边形 语言 设计 流程 思路 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)