图形图像 多媒体类 机械电子 办公系列 程序设计 网站开发 数据库教程 路由技术 网络原理 网络应用 考试认证
手机分类
  网站导航: 电脑时代在线 · 程序设计 · C语言 · C语言编程实例

C趣味程序百例(28)

手机资讯
『C趣味程序百例(28)』如果文章中有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 来源:无 更新时间:2005-6-7 
87.黑白子交换
88.常胜将军



87.黑白子交换
   有三个白子和三个黑子如下图布置:
○ ○ ○ . ● ● ●
   游戏的目的是用最少的步数将上图中白子和黑子的位置进行交换:
● ● ● . ○ ○ ○
   游戏的规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子。请用计算机实现上述游戏。
*问题分析与算法设计
   计算机解决胜这类问题的关键是要找出问题的规律,或者说是要制定一套计算机行动的规则。分析本题,先用人来解决问题,可总结出以下规则:
   (1) 黑子向左跳过白子落入空格,转(5)
   (2) 白子向右跳过黑子落入空格,转(5)
   (3) 黑子向左移动一格落入空格(但不应产生棋子阻塞现象),转(5)
   (4) 白子向右移动一格落入空格(但不应产生棋子阻塞现萌),转(5)
   (5) 判断游戏是否结束,若没有结束,则转(1)继续。
   所谓的“阻塞”现象就是:在移动棋子的过程中,两个尚未到位的同色棋子连接在一起,使棋盘中的其它棋子无法继续移动。例如按下列方法移动棋子:
  0
○ ○ ○ . ● ● ●  1 ○ ○ . ○ ● ● ●  2  △ ○ ○ ● ○ . ● ●  3
○ ○ ● . ○ ● ●  4    两个●连在一起产生阻塞
○ ○ ● ● ○ . ● 或4   两个白连在一起产生阻塞
○ . ● ○ ○ ● ●
   产生阻塞的现象的原因是在第2步(△状态)时,棋子○不能向右移动,只能将●向左移动。
   总结产生阻塞的原因,当棋盘出现“黑、白、空、黑”或“白、空、黑、白”状态时,不能向左或向右移动中间的棋子,只移动两边的棋子。
   按照上述规则,可以保证在移动棋子的过程中,不会出现棋子无法移动的现象,且可以用最少的步数完成白子和黑子的位置交换。
*程序与程序注释
#include<stdio.h>
int number;
void print(int a[]);
void change(int *n,int *m);
void main()
{
   int t[7]={1,1,1,0,2,2,2};   /*初始化数组1:白子  2:黑子  0:空格*/
   int i,flag;
   print(t);
   while(t[0]+t[1]+t[2]!=6||t[4]+t[5]+t[6]!=3)  /*判断游戏是否结束
                                    若还没有完成棋子的交换则继续进行循环*/
   {
      flag=1;      /*flag 为棋子移动一步的标记1:尚未移动棋子  0:已经移动棋子*/
      for(i=0;flag&&i<5;i++)      /*若白子可以向右跳过黑子,则白子向右跳*/
         if(t[i]==1&&t[i+1]==2&&t[i+2]==0)
         {change(&t[i],&t[i+2]); print(t); flag=0;}
      for(i=0;flag&&i<5;i++)      /*若黑子可以向左跳过白子,则黑子向左跳*/
         if(t[i]==0&&t[i+1]==1&&t[i+2]==2)
         {change(&t[i],&t[i+2]);  print(t);  flag=0;}
      for(i=0;flag&&i<6;i++)   /*若向右移动白子不会产生阻塞,则白子向右移动*/
         if(t[i]==1&&t[i+1]==0&&(i==0||t[i-1]!=t[i+2]))
         {change(&t[i],&t[i+1]); print(t);flag=0;}
      for(i=0;flag&&i<6;i++)   /*若向左移动黑子不会产生阻塞,则黑子向左移动*/
         if(t[i]==0&&t[i+1]==2&&(i==5||t[i-1]!=t[i+2]))
         { change(&t[i],&t[i+1]); print(t);flag=0;}
   }
}
void print(int a[])
{
   int i;
   printf("No. %2d:.............................\n",number++);
   printf("      ");
   for(i=0;i<=6;i++)
      printf(" | %c",a[i]==1?'*':(a[i]==2?'@':' '));
   printf(" |\n &nbs

[1] [2] 下一页

】【关闭窗口
  上一页:
  下一页:后面的文章暂时没有更新了,请多关注QQgb.com
 ·网站导航: 电脑时代在线 · 程序设计 · C语言 · C语言编程实例
C语言编程实例:相关文章
C语言编程实例点击榜
普通教程氢原子电子云模拟显示
普通教程非常漂亮地4-瓣花型图案
普通教程旋转地立体椭球(效果非常好)
普通教程静态网格椭球
普通教程弹簧单摆地模拟演示
普通教程一个时钟程序,可以显示当前时间
普通教程自己写地一个链表综合程序
普通教程锁硬盘逻辑盘程序
普通教程学生成绩管理系统
普通教程学生个人消费管理系统
搞笑自拍|图片故事|美女图库|体坛宝贝|明星爆料|世界奇观|风光摄影|历史回忆|大千世界
C语言编程实例推荐图片
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部  
网站文本地图
  版权所有:电脑时代在线 2005-2009 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2007 www.PCvz.com online services. all rights reserved. 蜀ICP备05015578
Template designed by PCX. Optimized for 1024x768 to Firefox,Opera and MS-IE. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光