数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
楼主: liuye216

求助:棋子颜色变化 大家一定帮帮忙呀!

[复制链接]
发表于 2004-6-7 06:12:22 | 显示全部楼层
我是新手,帮帮我呀![em08][em06]
发表于 2004-6-12 06:51:23 | 显示全部楼层
<>也可以这白为-1,黑为1</P><>试试看</P><>好像更简单</P><P>颜色相同即两数相乘为1为黑</P><P>不同为-1为白</P><P>………………</P>
发表于 2004-6-13 06:51:46 | 显示全部楼层
<><b><FONT color=#000066>何志拓  </FONT></b>言之有理。</P><>虽是一个小小的程序,但编程时错误往往都是在一些细节末节上。</P>
发表于 2004-6-15 01:53:50 | 显示全部楼层
<>哈哈</P><>班门弄斧</P>
发表于 2004-6-20 19:51:42 | 显示全部楼层
<>八个棋子 a1 a2 ..... a8,ai=1 表示黑色,ai=-1表示白色
第1轮的颜色是 (a1 * a2)(a2*a3)(a3*a4)(a4*a5)(a5*a6)(a6*a7)(a7*a8)(a8*a1)
第2轮的颜色是(a1*a2*a2*a3)(a2*a3*a3*a4)(a3*a4*a4*a5)(a4*a5*a5*a6)(a5*a6*a6*a7)(a7*a8*a8*a1)(a8*a1*a1*a2)
化简一下就是(a1*a3)(a2*a4)(a3*a5)(a4*a6)(a5*a7)(a6*a8)(a7*a1)(a8*a2)
第3轮的颜色是:(a1*a2*a3*a4)(a2*a3*a4*a5)(a3*a4*a5*a6)(a4*a5*a6*a7)(a5*a6*a7*a8)(a6*a7*a8*a1)(a7*a8*a1*a2)
4轮的颜色是:(a1*a5)(a2*a6)(a3*a7)(a4*a8)(a5*a1)(a6*a2)(a7*a3)(a8*a4)
5轮的颜色是:(a1*a2*a5*a6)(a2*a3*a6*a7)(a3*a4*a7*a8)(a4*a5*a8*a1)....
6轮的颜色是:(a1*a3*a5*a7)(a2*a4*a6*a8)(a3*a5*a7*a1)(a4*a6*a8*a2)....
7轮的颜色是:(a1*....*a8)(a1*....*a8)(a1*....*a8)(a1*....*a8)(a1*....*a8)....
8轮的颜色 就是全黑色了
</P>
发表于 2004-6-21 20:35:14 | 显示全部楼层
新人 看不懂[em06]
发表于 2004-6-24 02:56:04 | 显示全部楼层
<>:
#include&lt;iostream.h&gt;
void main()
{
short int s[8]={0,0,0,0,0,0,0,0},a=0,b=0;
short int from=10,to=100;
for(a=from;a&lt;=to;a++){b=a;
for(int k=0;k&lt;8;k++){s[7-k]=b%2;b=int(b/2);}
for(int j=0;j&lt;=8;j++){
  for(int m=0;m&lt;8;m++)cout&lt;&lt;s[m];
  cout&lt;&lt;'\t';
  myxor(s);//实现p=s; ROL p, 1; s=s xor p;  其中rol为汇编语句
                                            //表示循环左移(Rotate Left)
}
cout&lt;&lt;endl&lt;&lt;endl;
for(int i=0;i&lt;8;i++)if(s!=0)cout&lt;&lt;s;


}
}</P><>对于该算法,不知道版主是否执行过,本人在自己的C++程序发生错误~!</P>
发表于 2004-6-29 11:46:51 | 显示全部楼层
<>15楼dormouse_buaa 说得很有道理,比较容易理解。
楼上说程序出错应该是少了myxor(s)子程序。
void myxor(short int s[8])
{
short int a=s[0];
for(int i=0;i&lt;7;i++)
{
  if (s==0)s=s+s[(i+1)%8];
  else if (s[(i+1)%8]==1)s=0;
  else s=1;
}
if (a==1)
{if(s[7]==0)s[7]=1;
else s[7]=0;
}
}</P>
<>
下面是修改后的一个程序,执行效率会提高一点,用了C++的位运算,C++中是否有循环左移运算。</P>
<>#include&lt; iostream.h&gt;
#include&lt; stdio.h&gt;
void main()
{
short int TEMP,TEMP1,TEMP2;
short int a=1,count=0;
double l=0;
for(int s=0;s&lt;=255;s++){
  TEMP=s;
  for(int k=0;k&lt;8;k++){//实现p=s; ROL p, 1; s=s xor p;8次。-- 其中rol为汇编语句表示循环左移(Rotate Left)
   TEMP2=TEMP;
   TEMP1=TEMP;
   TEMP=((TEMP&amp;128)&gt;&gt;7)+((TEMP&lt;&lt;1)&amp;255);
   TEMP=TEMP1^TEMP;
   if(TEMP==0)break;
}</P>
<P>  if(TEMP!=0){cout &lt;&lt; "发现一个不满足为 " &lt;&lt; s &lt;&lt; endl;</P>
<P>  count++;</P>
<P>}</P>
<P>
}
cout &lt;&lt; "共发现" &lt;&lt; count &lt;&lt; "个不满足" &lt;&lt; endl;
cout &lt;&lt; "下面是一例:" &lt;&lt; endl;
TEMP=111;
for(int k=0;k&lt;8;k++){
   TEMP2=TEMP;
   ////////////将过程输出////////////////////
   for(int i=0;i&lt;9;i++){
    l=((TEMP2&amp;1)+l)/10.0;TEMP2=TEMP2&gt;&gt;1;
    a=a*10;
   }
   printf("%0.8lf",l+k);l=0;a=1;cout&lt;&lt; endl;
   ///////////////////////////////////////////
   TEMP1=TEMP;
   TEMP=((TEMP&amp;128)&gt;&gt;7)+((TEMP&lt;&lt;1)&amp;255);
   TEMP=TEMP1^TEMP;
}
}
  欢迎批评指教!</P>
[此贴子已经被作者于2004-6-29 8:30:22编辑过]

发表于 2004-7-8 05:32:37 | 显示全部楼层

回 iamfei

<>什么叫“放完了撤掉原来的棋子”?</P>
<>题意都不是很明白哦!!</P>
发表于 2004-7-14 01:33:58 | 显示全部楼层
<>我想问一下,后来添加上去的棋子是不是也要再重新按照规则安排棋子啊!</P><> 这样的话,最终的结果就会有很多的出入啊!我想每次排完后都是8颗棋子上面那位大哥的算法可以改进一下的,可以写成1+1=0;1+0=1;0+1=1;0+0=1;用c语言可以编辑就行了 加上一句  if a=1||a=0;就停止下来。</P><>这样是不是要简单一点。</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

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

GMT+8, 2024-4-26 15:13 , Processed in 0.052303 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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