五子棋程序设计说明书及五子连珠问题模型研究_第1页
五子棋程序设计说明书及五子连珠问题模型研究_第2页
五子棋程序设计说明书及五子连珠问题模型研究_第3页
五子棋程序设计说明书及五子连珠问题模型研究_第4页
五子棋程序设计说明书及五子连珠问题模型研究_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中北大学程序设计课程设计说明书学生姓名:学号:10051041学院:信息与通信工程学院专业:光电信息工程题目:五子棋指导教师:职称:2012年01月06日(纪念我已经逝去的大学生活)院:信息与通信工程学院专业:光电信息工程学生姓名:学号:10051041课程设计题目:五子棋起迄日期:2011年12月24日~2012年1月6日课程设计地点:111420指导教师:系主任:下达任务书日期:2011年12月25日课程设计任务书1.设计目的:1熟悉C语言程序设计的原理与方法;2掌握C语言开发环境下程序的具体设计;3掌握利用C语言分析解决具体问题。2.设计内容和要求:设计内容:用C语言设计一个五子棋游戏程序,允许游戏者自由选择棋子颜色,实现人人对战和人机对战,利用时间函数设置实现落子倒计时功能程序应该具有以下基本功能:1.显示欢迎界面。2.玩家棋子可选,棋盘范围足够。3.落子时间倒计时。设计要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。3.对系统进行功能模块分析、画出总流程图和各模块流程图。4.用户界面要求使用方便、简洁明了、美观大方、格式统一。5.所有程序需在Win-Tc或MicrosoftVisualC++6.0环境调试通过。3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:课程设计说明书一份;电子文档(说明书、设计程序)一份课程设计任务书4.主要参考文献:谭浩强《c程序设计》北京大学出版社5.设计成果形式及要求:课程说明书打印,并装订;必要的程序流程图和程序附录。6.工作计划及进度:2011年12月24日~2011年12月26日下达设计任务书,学生熟悉设计内容;2011年12月27日~2011年12月29日查阅参考资料,确定基本设计方案;2011年12月29日~2012年01月04日C语言进行程序设计;2012年01月05日~2012年01月06日完成设计报告;2012年01月06日答辩;系主任审查意见:签字:年月日目录1、课程设计的背景及意义……………062、设计的基本原理………063、设计的基本过程………084、设计的结果……………105、总结和结论…………….11设计背景及意义我们的五子棋程序是在VisualC++6.0环境下运行的。\o"查看图片"VisualC++6.0MicrosoftVisualC++(简称VisualC++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,Microsoft.NET框架。目前最新的版本是MicrosoftVisualC++2010。VisualC++6.0集成了MFC6.0,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。2.设计的基本原理2.1问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。此时,算法结束。

2.2需求分析(1)输出棋盘界面(2)要求玩家选择棋子(3)玩家轮流下棋(4)判断键盘输入哪个键按规则执行操作(5)判断谁先落棋(6)判断赢家(7)输出结果界面2.3流程图开始玩家选择棋子玩家移动棋子输出棋盘界面O方先输入棋子坐标刷新棋盘界面转换玩家判断棋子是否出界判断是否重子输出胜利界面刷新棋盘界面结束判断是否赢棋NNNYYY开始玩家选择棋子玩家移动棋子输出棋盘界面O方先输入棋子坐标刷新棋盘界面转换玩家判断棋子是否出界判断是否重子输出胜利界面刷新棋盘界面结束判断是否赢棋NNNYYY3设计的基本过程charb[40][40];voidshow()//输出获胜图像//{inti=0,j=0;//i为横坐标变量,j为纵坐标变量// for(i=0;i<40;i++)//对图像数组赋初值// for(j=0;j<40;j++) {b[i][j]=46;} for(i=0;i<40;i++)//对图像数组特定点赋值// for(j=0;j<40;j++) { if(i>10&&i<16) {if(j>10&&j<16||j>25&&j<31) b[i][j]='O';} else { if(i==21) {if(j>=6&&j<=35) b[i][j]='O';} else { if(i==22) {if(j>=7&&j<=34) b[i][j]='O';} else { if(i==23) {if(j>=8&&j<=33) b[i][j]='O';} else { if(i==24) {if(j>=9&&j<=31) b[i][j]='O';} else { if(i==25) {if(j>=10&&j<=30) b[i][j]='O';} else { if(i==26) {if(j>=12&&j<=28) b[i][j]='O';} else { if(i==27) {if(j>=14&&j<=26) b[i][j]='O';} else { if(i==28) {if(j>=17&&j<=23) b[i][j]='O';} } } } } } } } } } for(i=0;i<40;i++)//输出图像数组// { for(j=0;j<40;j++) printf("%c",b[i][j]); printf("\n"); } }详细说明:Show函数的目的是输出获胜界面,调用全局变量b[][](目的是为图像分配存储空间),i为横坐标变量,j为纵坐标变量,接下来的两个for是把b[][]初始化为“.”,再接下来的双for是为塑形:限定行间距为10<i<16,再限定列间距为10<j<16或25<j<31,用判断语句来塑造图形“双眼”;当i=21时,限定6<=j<=25,当i=22,23,24,25,26,27时同理,用判断语句来塑造“嘴”,最后用双for语句来输出图形。4设计结果玩家获胜显示界面截图5总结与结论课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。

这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!附录负责人设计内容Viodjudge()函数的设计及程序的调试Viodjudge()函数的设计及程序的调试Voidmove()函数的设计及课程设计说明书的排版制作Intplaying()函数的设计及程序的调试Voidshowcheckerboard()函数设计及相关操作Voidshow()函数的设计及程序的调试程序源代码:#include<stdio.h>#include<string.h>chara[65][65];charb[40][40];voidshow()//输出获胜图像//{inti=0,j=0;//i为横坐标变量,j为纵坐标变量// for(i=0;i<40;i++)//对图像数组赋初值// for(j=0;j<40;j++) {b[i][j]=46;} for(i=0;i<40;i++)//对图像数组特定点赋值// for(j=0;j<40;j++) { if(i>10&&i<16) {if(j>10&&j<16||j>25&&j<31) b[i][j]='O';} else { if(i==21) {if(j>=6&&j<=35) b[i][j]='O';} else { if(i==22) {if(j>=7&&j<=34) b[i][j]='O';} else { if(i==23) {if(j>=8&&j<=33) b[i][j]='O';} else { if(i==24) {if(j>=9&&j<=31) b[i][j]='O';} else { if(i==25) {if(j>=10&&j<=30) b[i][j]='O';} else { if(i==26) {if(j>=12&&j<=28) b[i][j]='O';} else { if(i==27) {if(j>=14&&j<=26) b[i][j]='O';} else { if(i==28) {if(j>=17&&j<=23) b[i][j]='O';} } } } } } } } } } for(i=0;i<40;i++)//输出图像数组// { for(j=0;j<40;j++) printf("%c",b[i][j]); printf("\n"); } }voidmove(int*x,int*y)/*移动棋子的方向*///x为上一步棋子横坐标,y为上一步棋子纵坐标//{ charb[40];//为记录棋子将要移动的步伐// inti,z,flag=1;//z为某一步的中间变量,flag为标志变量// gets(b);//输入要移动的步伐// for(i=0;i<40;i++) { z=b[i];//把b【】的某一步传递给z// switch(z)//判断移动棋子方向// { case119:*x=*x-1;break;//w键控制棋子上移// case97:*y=*y-1;break;//a键控制棋子左移// case115:*x=*x+1;break;//s键控制棋子下移// case100:*y=*y+1;break;//d键控制棋子右移// case111:flag=0;break;//o键确定落子// } if(flag==0)break;//判断某步是否移动完成// }}intplaying()/*开始下棋*/{intflag=1,i=0,x=0,y=0,k,l,n=0,m=1;//flag为记录哪方下棋的标志变量,x,y为a[][]的横纵坐标,m,n分别记录o方,@方的积累步数// int*p1=&x,*p2=&y; intjudge(intx,inty);//本函数所用子函数的声明// voidmove(int*p1,int*p2); voidshowcheckerboard(intx,inty); printf("O方先输入首子坐标:"); scanf("%d%d",&x,&y);//输入首坐标// a[x][y]='O';//首坐标的棋盘位置画棋子// showcheckerboard(m,n);//输出更新后的棋盘// for(i=0;i<2000;i++)//改变玩家// { if(flag==1) flag=0; else flag=1; for(k=0;k<2000;k++)//玩家落子并判断下的棋子是否过界或此处是否有子// { if(flag==1) { printf("O方下棋\n");m++;} else { printf("@方下棋\n");n++;}move(p1,p2); if(x>=1&&x<=64&&y>=1&&y<=64) { if(a[x][y]==46)break; else {if(flag==1)m--;elsen--; printf("此处有子,请继续移子"); continue; } } else{if(flag==1)m--;elsen--;printf("此处过界,请继续移子");} } if(flag==1)//在a[][]的特定位置更新字符// a[x][y]='O'; else a[x][y]='@'; showcheckerboard(m,n);//更新棋盘// l=judge(x,y);//记录谁赢变量// if(l==1)returnflag; }}voidshowcheckerboard(intx,inty)/*画出棋盘*///x,y分别为o方下棋步数,@方下棋步数//{ inti,j,w=0;//i,j为横纵坐标变量//printf("================================================================================================================\n");printf("0方累计下棋步数:%d@方累计下棋步数:%d\n",x,y);printf("================================================================================================================\n"); for(i=0;i<65;i++)//输出横纵坐标// printf("%2d",i); printf("\n"); for(i=1;i<65;i++) { for(j=0;j<65;j++) { if(j==0) { w+=1; printf("%2d",w); } else { printf("%2c",a[i][j]); } } printf("\n"); } }intjudge(intx,inty)/*判断各方向五子是否连成一线*///x,y分别为横纵坐标//{ inti,b,c,d,e,z=1;//z为标志变量,记录每个方向连棋个数// for(i=1;i<5;i++)//垂直向下数// { if(a[x][y+i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak; } for(i=1;i<5;i++)//垂直向上数// { if(a[x][y-i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak; } e=z;z=1;for(i=1;i<5;i++)//水平向右数// { if(a[x+i][y]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak; }for(i=1;i<5;i++)//水平向左数// { if(a[x-i][y]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak;}b=z;z=1;for(i=1;i<5;i++)//向左下方数// { if(a[x-i][y+i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak;}for(i=1;i<5;i++)//向右上方数// { if(a[x+i][y-i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak;}c=z;z=1;for(i=1;i<5;i++)//向左上方数// { if(a[x-i][y-i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak;}for(i=1;i<5;i++)//向右下方数// { if(a[x+i][y+i]==a[x][y]) { z+=1; if(z==5) {return(1);break;} } elsebreak;}d=z;if(e!=5&&b!=5&&c!=5&&d!=5)//判断某个方向五子连棋//{ return(0);}}voidmain(){intx,y,flag,m=0,n=0,p=0;//flag为哪方下棋的判断变量,m,n为分别记录双方的步数//printf("================================================================================================================\n");printf("w为上移动,a为左移动,s为下移动,d为右移动,o确定落棋子\n");printf("=================================================================================================================\n");printf("玩家1选择棋子:选0方输入1,选@方输入2\n");scanf("%d",&p);for(x=1;x<65;x++)//棋盘数组初始化//for(y=1;y<65;y++)a[x][y]=46;showcheckerboard(m,n);//输出棋盘//flag=playing();//下棋//show();//输出获胜图形//if(flag==1)//判断哪方获胜//printf("O方获胜");elseprintf("@方获胜");}参赛队号:16018选题题号:A五子连珠问题模型研究摘要本文针对“五子连珠”问题在二维网格和三维网格的最优方案进行建模与求解。对于六行七列网格的情况进行分析,先考虑一维情况下的模型,并将一维情况下模型的周期性性质推广至二维,据此建立0-1规划模型,进行求解得最优方案为最少取出8个棋子。并对结果的准确性进行理论证明,对此给出两种证明方法。第一中可以通过软件求解过程中的输出信息来给与证明,第二种通过反证法进行理论证明。对上述结果对应的方案进行研究,得到二维网格中最优方案的变化存在一定的周期性,据此周期性建立递推模型,并得到实用于一般二维网格中最优方案的数学模型,对13行17列的网格进行求解,的到最少取出44个棋子。对此二维网格最优方案的周期性进一步研究并推广到三维网格中,通过二维网格叠加形成三维网格的方式,从而建立了三维网格中的最优方案的数学模型,并对6*7*6的网格进行求解的到少取出50个棋子。关键字:0-1规划,递推模型,网格叠加

1问题重述问题1:在6×7的长方形棋盘放满棋子。从这42个棋子中取出一些棋子,使得棋盘上剩下的棋子,没有五个在一条直线(横、竖、斜方向)上依次相连,最少取出多少个棋子才能满足要求?同时给出一种去掉棋子的方式。问题2:问题1中使用数学证明的方法,只能解决规模很小的问题。现在从一般性的问题考虑,一利用数学建模的方法建立一般模型,然后设计算或利用软件求解。基于此,请针对任意规模的棋盘,满足的条件与问题1相同。问至少去掉多少个棋子。问题3:三维问题将该二维平面网格扩展到三维空间,得到一个的空间长方体网格。在这些格子中同样都填满了棋子,现要从中抽取一部分,使得每种平面,包括横向所截的m个平面,纵向所截的n个平面,竖直方向所截的p个平面,在每个平面上在横向、纵向、斜方向上都不出现5子连珠。并且要求在空间斜线上也不出现5子连珠。问最少去掉多少个棋子可以满足要求。请建立一般问题的数学模型。并给出具体的解结果。

2问题分析2.1问题(1)分析由题意可知,要求解一个取出的数量最少的取棋子方案。此问题中可以通过0-1变量来表示每个位置上的棋子是否被取出,若取出,则用1表示,否则用0表示。那么就可以用一个0-1矩阵来表示方案,则含有1的个数最少,且满足题目中三个条件的矩阵就表示的是最优方案。因此可以建立0-1规划模型,对问题进行求解。模型的目标函数即为矩阵的行列变量总和。模型的约束条件可以通过题目中的三个条件来给定。而对于这三个条件,先考虑一维情况下的模型,并将一维情况下的模型的性质推广至二维,并由此性质来建立对应的约束条件。对于结果准确性,可以通过软件求解过程中的输出信息来给与证明,也可以通过反证法来进行理论证明。2.2问题(2)分析本题目要求将问题一的模型推广至一般情况。先对问题(1)的结论进行分析,得出结论所具有的性质,并加以理论证明,然后将其性质推广至一般情况。先将问题一中的模型的行数推广至一般情况,并在此基础上,将列数也推广至一般情况,从而建立一般情况下的模型。的模型还需要考虑特殊情况:行数小于5或者列数小于5。对此,很容易能得到在行数和列数都小于5的情况下,不需要取出任何点,即结果为零;对于只有列数小于5或者行数小于5的情况,规定每行或者每列的最优结果的累加,即是最终结果。而对于每行或者每列的最优结果,可以通过一般一维模型下的最优结果的算法给出。2.3问题(3)分析本题目要求将平面网格推广至三维空间,建立一般模型,并计算6x6x7情况下的最优结果。在问题二模型的基础上将结果的性质经一部推广至三维网格,这样,就可以直接应用结果的性质,通过二维到三维网格的二维网格扩充的方式对三维模型进行建立。3模型假设假设二维网格中的每个格子都是1x1的小正方形,在三维网格中,每个格子是1x1x1的小正方体。假设格子之间共顶点或者共边时,两个字相连。假设在相连的格子中的棋子的距离是1。假设每个小方格或者小正方体中只能放一个棋子。4符号说明 表示0-1变量 表示方案矩阵的列向量 表示方案矩阵的行向量 表示n对m向上取整 表示n对m向下取整 表示二维网格最少可取棋子的数量 表示三维网格最少可取棋子的数量 表示n对m取余数5模型建立和求解5.1问题1的模型建立与求解5.1.1模型建立前提理论为了在二维片面上建立模型,先来研究模型在一维情况下的性质,要在n个方格中取棋子,则可以用一个n元素只有0和1的n维向量a来表示最取棋子方案。则为了使得取棋子总数最少,及方案最优,就有结论:表示a向量的第i个分量) (1)其中,表示向下取整,表示向上取整。将此性质推广至二维网格,则对于二维网格的取棋子方案矩阵 (2)其中为矩阵W的列向量,为W的行向量则有如下结论: (3) (4)且在各行各列性质在W各行,各列以及各对角线上仍然成立。这个结论很容易便可从一维的情况得到,只要证明ri和ci中的每个分量都和及的对应分量相等即可,这从一维的情况中很容易就能得到。5.1.2模型建立对于6×7网格的问题,先设取棋子方案矩阵位: (5)根据上述性质式(3)、(4)可得: 将其带入取棋子方案矩阵,并对位置变量进行重新编号,则可对取棋子方案矩阵进行简化,且简化后取棋子方案矩阵为: (6)为使方案各行满足条件,可对此矩阵各行使用性质式(2),则可得式(7)所示约束条件;为使方案各列满足条件,可对此矩阵各列使用性质式(2),可得式(8)所示约束条件;为使方案的各条对角线满足条件,我们仅对长度大于4的对角线使用式(2),可得式(9)、(10)所示8条约束条件。 (7) (8) (9) (10)联立以上各约束条件,并通过W矩阵建立模型如下: (11)求解模型,则可得最少的取棋子个数及最优方案矩阵,其中Z的值就是最少可取走的棋子的数量。将,,带入W则可得到最优方案矩阵。5.1.3模型求解对于上述0-1规划模型,我们可直接通过MATLAB软件求解。我们得到的所有解如下:图SEQ图\*ARABIC1最优方案示意图通过求解模型得到最少取棋子数量为8个,一方面,通过软件求解过程当中的输出的最优解得类型来判定此结果就是最少的取棋子个数;另一方面,可通过反证法来证明8就是最少取棋子个数。反证法证明:假设七个棋子可以满足条件,则有W矩阵的7个列向量中都只能有一个非零的分量,且有,不妨设,,,,则此时,W矩阵的最后一行全为零,此取棋子方案表示在6x7网格的第6行中不取走任何棋子,显然,在第6行中出现7个棋子连续的情况。由此我们可以知道取走7个棋子是无法。即8个棋子为最少的取棋子数量。5.2问题(2)的模型建立和求解5.2.1模型建立理论准备根据问题一中一维模型最优方案的性质到二维网格中最优性质的推广结论式(3)、(4),将其作适当推广可得如下(12)、(13)两条性质:对于m行n列的网格,其最优方案矩阵W的行向量ri=和列向量cj (12)其中,; (13)其中,。此性质说明的是:在二维网格中,随着行和列的扩充,最优方案和最优取棋子矩阵的变化具有一定的周期性,且周期为5,即行数每增加5,或者列数每增加5,最优方案矩阵将在矩阵的后边拼接一个特定的矩阵。最优方案对应的取棋子个数也将以特定的值增加。据此,便可将二维网格中最优方案的模型推广至一般情况。5.2.2模型建立在以上理论基础上,通过最优方案的行周期性,可将二维网格的行数推广到一般情况。以5×5网格为初始的网格状态,可建立网格扩充5×n时的最少取棋子个数模型如下:其中,表示在网格中最优方案所对应的取棋子个数,n%5表示n和5的求余数运算。在此基础上,建立将网格扩充成为时,最优取棋子个数的模型: 以上模型都是建立在m,n大于5的情况下,为保证模型的一般性,还需考虑m,n小于5的情况,当m,n都小于5时,显然有最优方案为不去出任何棋子,即最优取棋个数为0,最优取棋矩阵为全零矩阵。而对于m,n中仅有一个小于5的情况,由式(2)可知为使达到最优,故规定: 带入上述,模型,则可得到完整的一般情况下的模型为:5.2.3模型求解对上述模型的求解,通过MATLAB软件编写函数fhanshu(m,n)来实现(函数具体代码在附件二中),其返回值为最少的可取出的棋子数量,并且会根据结果的数量进行二维示意图绘制,如果返回值为零则不进行绘图且输出不用取出任何棋子的说明,否则,则绘制相应的最优取棋子方案示意图。将m=13,n=17,带入函数可得最少可取棋子数量为:44,其绘制出的最优方案示意图有多个,其中一个示意图如图所示,图SEQ图\*ARABIC213x17最优方案示意图5.3问题(3)模型建立和求解5.3.1模型建立前的理论准备1)对问题二中,二维网格最优解的周期性性质可推广至三维情况,即在三维网格中,随着层数的扩充,最优方案和最优取棋子矩阵的变化具有一定的周期性,且周期为5。此性质在三维情况下可以通过面周期性加以证明。2)分析问题二的结果,可得到如下结论,其中,‘+’为0-1向量的加法运算,可参看符号说明。将此性质推广至三维,即其中某一三维网格最优方案的连续叠加在一起的五个二维网格的取棋子方案,则可保证空间斜线上不出现五颗棋子连续的情况。对此性质,可考虑可通过反证法进行证明。假设对于某三维网格最优方案上述性质不满足,即在此最优方案中有则不妨设则可由0-1变量‘+’运算方法知:;由此可知此方案中有五个连续的棋子,那么这种方案就不是最优解。由此,也就的到上述性质在三维网格中成立。5.3.2模型建立对三维情况下模型的建立,只需要将问题二中的模型在层数上进行扩充。以维初始网格状态对网格进行扩充,并记此5x5x5网格的最少可取t个棋子,则可建立网格扩充为时最少取棋子个数的模型:其中表示在空间网格中最少可取的棋子数量。同样的我们规定:则可得到在三维空间网格中最少可取棋子个数的模型为:5.3.3模型求解对上述模型的求解,通过MATLAB软件编写函数3dimension(m,n,p)来实现(函数具体代码在附件三中),其返回值为最少的可取出的棋子数量,并且会根据结果的数量进行二维示意图绘制,如果返回值为零则不进行绘图且输出不用取出任何棋子的说明,否则,则绘制相应的最优取棋子方案示意图。将m=6,n=7,p=6,带入函数可得最少可取棋子数量为:50。得到最优方案对应,x,y,z坐标在附加的程序3;6模型的评价及改进6.1问题一的模型评价及改进问题一建立的模型是0-1规划模型,通过了简单的方法去解决复杂的问题,简单明了,容易理解。模型的建立在一维模型的基础上,十分有利于模型向更高维数的推广。解决了6x7二维网格的最少取旗子数量问题。但是由于只能解决具体的问题,模型不具有一般性,网格行列数不同的问题不能进行求解。问题二中针对这一缺点给出了解决一般问题的模型。6.2问题二的模型评价及改进问题二模型是基于问题一以及一维情况下的模型性质的,并由此得到了二维网格在扩充过程当中周期性规律,并由此建立了相应的最优去棋子个数的模型。这样就使得程序模型的求解在程序实现等过程就变得相当简单。将复杂的问题,通过其规律性简化。但模型的缺点就是通过结果的规律性直接对问题进行了建模求解,从模型当中看不出问题结果的实际推导过程,是一个相对比较高度集中的模型。6.3问题三的模型评价及改进问题三的模型是基于问题二的模型的。通过二维模型的周期性性质相三位情况的推广,发现了三位情况下最优方案仍然具有周期性,这对这一问题模型的建立起到了极其重要的作用。和问题二中的模型一样,该模型通过的求解在程序实现时是相当简单的。同样,由于模型只给出了最终结果的计算方式,是一个相对比较集中的模型,在模型中看不出结果的实际转换过程。

7参考文献姜启源,叶其孝,数学建模,北京:机械工业出版社,2009.8.马莉,MATLAB语言实用教程,北京:清华大学出版社,2010.1.薛定宇,陈阳泉,高等数学问题的MATLAB求解,北京:清华大学出版社,2008.汪晓银,周保平,数学建模与数学实验(第二版),北京:科学出版式,2012.8.同济大学数学系,高等数学(第二版)上册,上海:同济大学出版社,2009.10.占军,张倩,MATLAB函数查询手册,北京:机械工业出版社,2011.1.

8附录程序1a=zeros(4,25);a(1,3)=1;a(1,9)=1;a(1,15)=1;a(1,16)=1;a(1,22)=1;a(2,5)=1;a(2,6)=1;a(2,12)=1;a(2,18)=1;a(2,24)=1;a(3,3)=1;a(3,7)=1;a(3,11)=1;a(3,20)=1;a(3,24)=1;a(4,5)=1;a(4,9)=1;a(4,13)=1;a(4,17)=1;a(4,21)=1;c=[22111];b=zeros(14,25);b(1,1:5)=c;b(2,6:10)=c;b(3,11:15)=c;b(4,16:20)=c;b(5,21:25)=c;b(6,1)=2;b(6,7)=1;b(6,13)=1;b(6,19)=1;b(6,25)=1;b(7,2)=2;b(7,8)=1;b(7,14)=1;b(7,20)=1;b(7,21)=1;b(8,1)=2;b(8,10)=1;b(8,14)=1;b(8,18)=1;b(8,22)=1;b(9,2)=2;b(9,6)=1;b(9,15)=1;b(9,19)=1;b(9,23)=1;b(10,1)=2;b(10,6)=1;b(10,11)=1;b(10,16)=1;b(10,21)=1;b(11,:)=[0,b(10,1:24)];b(12,:)=[0,0,b(10,1:23)];b(13,:)=[0,0,0,b(10,1:22)];b(14,:)=[0,0,0,0,b(10,1:21)];f=ones(1,25);f(1:2)=[44];f(3:7)=[22222]f(11:12)=[22];f(16:17)=[22];f(21:22)=[22];A=[b;-b]d=[ones(14,1)*2;ones(14,1)*-1]aeq=a;beq=ones(4,1);[x,fv,exitflag,output]=bintprog(f,A,d,aeq,beq);程序2function[SA]=fhanshu(n,m)p=zeros(5,5);p(1,5)=1;p(2,3)=1;p(3,1)=1;p(4,4)=1;p(5,2)=1;B=[];C=[];D=[];%N<5,M>5;ifn<5||m==5ifm>5||m==5S=floor(m/5)*n;h=floor(m/5);k=mod(m,5);c=p(1:n,1:5);fori=1:hC=[C,c];endC=[C,c(1:n,1:k)]f=size(C,1);k=size(C,2);fori=1:fforj=1:kifabs(C(i,j)-1)<1e-5axis([1max(f,k)+11max(k,f)+1]);plot(j+0.5,i+0.5,'r*');title('五子连珠图2')gridon;holdonelseaxis([1max(k,f)+11max(k,f)+1]);plot(j+0.5,i+0.5,'ko');gridon;holdonendendendendend%N<5,M<5时ifn<5ifm<5S=0;endend%N>=5,M>=5ifm>5ifn>5l=floor(m/5);k=mod(m,5);c=p(1:5,1:5);fori=1:lB=[B,c];endB=[B,p(1:5,1:k)];x=floor(n/5);y=mod(n,5);fori=1:xD=[D;B];endD=[D;B(1:y,1:length(B))];s=size(D,1)f=size(D,2)figure(1)fori=1:sforj=1:fifabs(D(i,j)-1)<1e-5axis([1max(s,f)+11max(s,f)+1]);%axis([1s+11f+1])plot(j+0.5,i+0.5,'r*');

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论