数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 4191|回复: 3

!(急!求救)关于一个数学问题的程序实现问题!

[复制链接]
发表于 2005-11-15 08:03:07 | 显示全部楼层 |阅读模式
<FONT size=2>题目如下:<br><br>一条有N个点的线段(已知每个点的距离都是1,且N是偶数)<br><br>把自然数(从1开始)往这条线段的N个点上放,<br><br>条件是:   |Y-X|+D(X,Y)&gt;=N-1<br><br>就是任意两个点的数值差的绝对值加上两点间的距离,不小于N-1<br><br>求:最后放上的那个数最小可以是多少?lt;br&gt;<br><br>这是图论上的一个染色问题,已经困饶我好些日子了,各位大虾高手们研究一下拉<br><br>我已有些想法,先把问题放上,下面说我的想法。<br><br>恳求各位大虾们帮忙拉。<br><br>我的联系方式:<br>email: </FONT><a href="http://www.shumo.com/bbs/mailttears@jsmail.hebut.edu.cn" target="_blank" ><FONT size=2>tears@jsmail.hebut.edu.cn</FONT></A><br><br><FONT size=2>QQ: 2722701 </FONT><br>
[此贴子已经被作者于2005-11-15 0:12:43编辑过]

 楼主| 发表于 2005-11-15 08:09:31 | 显示全部楼层
<>我现在做法的假设是:</P>
<>1,前三个点定,从第四个点开始放。</P>
<>2,放置点的时候只需要考虑其和其前面放的两个点的条件满足既可。</P>

<P>程序如下:</P>
<P>/*<BR>  main函数仅判断是否偶数,然后调用calcul函数。</P>
<P>  calcul计算函数流程如下:<BR>  1、定义变量及结构体<BR>     其中,结构体中:re 结果;num  所处位置是第几个<BR>  2、对结构体申请空间<BR>  3、对申请到空间的结构体初始化(如果输入的是2,则直接输出结果)<BR>  4、赋前三个点的值(左、中、右)<BR>  5、记下最后赋值的两个点,再赋值的时候只和前两个点比较<BR>  6、从(N/2)+2开始,自左向右试,看是否合适,不合适,数加1,继续...<BR>     注意:因为程序是从左向右放置合适的数,可能此数还可以放置更向右的另一个位置,<BR>           由此可知排列不唯一,但排到最后最大的数是一样的。<BR>  7、当没有空位置的时候,跳出,打印...<BR>*/ </P>
<P><BR>#include&lt;stdio.h&gt;<BR>#include&lt;stdlib.h&gt;</P>
<P>typedef struct<BR>{<BR> int re;<BR> int num;<BR>} node;</P>
<P>/*----------计算函数----------*/<BR>calcul(int n)<BR>{<BR> int il;<BR> int t;<BR> int i;<BR> int compare1,compare2;<BR> int distance;<BR> int empty;<BR> node *proot,*p,*p1,*p2;</P>
<P> if(n==2)<BR> {<BR>  printf("(1) 1   ");<BR>  printf("(2) 1   \n\n");<BR>  printf("Want to close this window, press any key.");<BR> <BR>  getch();<BR>  return;<BR> } </P>
<P> proot=(node *)malloc(sizeof(node)*n);     /*申请空间*/<BR> if(proot==NULL)<BR> return;</P>
<P> p=proot;</P>
<P> for(il=1;il&lt;=n;il++)     /*清零*/                <BR> {<BR>  p-&gt;re=0;<BR>  p-&gt;num=il;</P>
<P>  p++;<BR> }</P>
<P> p=proot;       /*赋前三个值*/</P>
<P> p-&gt;re=n/2+1;<BR> p2=p;</P>
<P> t=n/2-1;<BR> p=p+t;<BR> p-&gt;re=1;</P>
<P> p=proot;<BR> t=n-1;<BR> p=p+t;<BR> p-&gt;re=n/2;</P>
<P> p1=p;</P>
<P> empty=n-3;</P>
<P>/*----------初始化结束----------*/</P>
<P><BR>/*----------计算----------*/<BR>p=proot;<BR>t=n/2+2;</P>
<P>while(empty!=0)<BR>{<BR> for(i=1;i&lt;=n;i++)<BR> {<BR>  if(p-&gt;re==0)<BR>  { <BR>    distance=p-&gt;num - p1-&gt;num;<BR>    if(distance&lt;0)<BR>    distance=-distance;<BR>    compare1=(t-p1-&gt;re)+distance;</P>
<P>    distance=p-&gt;num - p2-&gt;num;<BR>    if(distance&lt;0)<BR>    distance=-distance;<BR>    compare2=(t-p2-&gt;re)+distance;</P>
<P>    if( compare1&gt;=(n-1) &amp;&amp; compare2&gt;=(n-1) )<BR>    {<BR>     p-&gt;re=t;<BR>     t++;<BR>     empty--;</P>
<P>     p1=p2;<BR>     p2=p;<BR>     p=proot;<BR>          <BR>     break;<BR>    }  <BR>  } <BR>  p++;<BR> }<BR> t++;<BR> p=proot;<BR>}</P>
<P>p=proot;                 /*打印*/<BR>for(il=1;il&lt;=n;il++)        <BR>{<BR> printf("(%d) %d      ",il,p-&gt;re);<BR> p++;<BR>}<BR>printf("\n\n");<BR>printf("The biggest number is: (%d) %d\n\n\n",p2-&gt;num,p2-&gt;re);<BR>printf("Want to close this window, press any key...");</P>
<P>/*----------计算结束----------*/<BR>getch();<BR>return;<BR>}</P>
<P><BR>/*---主函数---*/<BR>main()<BR>{<BR>int n;</P>
<P>loop: printf("Pleast input a number,n=?\n\n");<BR>scanf("%d",&amp;n);<BR>      if (n%2==0)<BR>      {<BR>         printf("\n\n");<BR>         printf("n=%d\n\n",n);<BR>         calcul(n);<BR>      }<BR>      else<BR>      {<BR>         printf("\n\n");<BR>         printf("this number is not a even number,pleast input again\n\n");<BR>         goto loop;<BR>      }<BR></P>
 楼主| 发表于 2005-11-15 08:16:27 | 显示全部楼层
<>因为我每次都是从左向右遍历,所以有可能这个数值可以放在后面的其他位置,所以不是最优化的</P>
<>并且我使用的假定也有可能不是最优化的(既前三个点“左为N/2+1,中为1,右为N/2”)。</P>
<>请高手帮忙。</P>
发表于 2005-11-15 17:42:11 | 显示全部楼层
<>好手,我来试试看,</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 08:40 , Processed in 0.067601 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表