青蛙过河游戏和C#算法

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 
 10 namespace 青蛙过河
 11 {
 12     public partial class Form1 : Form
 13     {
 14         public Form1()
 15         {
 16             InitializeComponent();
 17         }
 18 
 19 
 20         private void button1_Click(object sender, EventArgs e)
 21         {
 22             //调用算法类
 23             FrogOverRiver FrogOverRiver = new FrogOverRiver();
 24             this.textBox1.Text = FrogOverRiver.getFrogJumpOrder();
 25         }
 26     }
 27 
 28     //青蛙过河类
 29     class FrogOverRiver
 30     {
 31 
 32         //获取青蛙的跳动顺序
 33         public string getFrogJumpOrder()
 34         {
 35             List<Frog> frogQueue = this.initializeFrogQueue();
 36             return this.frogJump(frogQueue, 3);

37         }

38 
 39 
 40         #region 辅助函数
 41 
 42         //初始化青蛙队列
 43         private List<Frog> initializeFrogQueue()
 44         {
 45             List<Frog> frogQueue = new List<Frog>();
 46             frogQueue.Add(new Frog(0, "左1", frogDirection.向右, false));
 47             frogQueue.Add(new Frog(1, "左2", frogDirection.向右, true));
 48             frogQueue.Add(new Frog(2, "左3", frogDirection.向右, true));
 49             frogQueue.Add(new Frog(3));
 50             frogQueue.Add(new Frog(4, "右1", frogDirection.向左, true));
 51             frogQueue.Add(new Frog(5, "右2", frogDirection.向左, true));
 52             frogQueue.Add(new Frog(6, "右3", frogDirection.向左, false));
 53             return frogQueue;
 54         }
 55 
 56         //当一个青蛙跳动后,形成一个新的队列
 57         private List<Frog> editFrogQueue(List<Frog> frogQueue, string frogName, int oldEmptyPositonID, int newEmptyPositonID)
 58         {
 59             List<Frog> newFrogQueue = new List<Frog>();
 60             foreach (Frog frog in frogQueue)
 61             {
 62                 Frog newFrog = new Frog(frog);
 63 
 64                 if (newFrog.isEmpty)
 65                     newFrog.position = newEmptyPositonID;
 66 
 67                 if (newFrog.frogName == frogName)
 68                 {
 69                     newFrog.position = oldEmptyPositonID;
 70                 }
 71 
 72                 newFrog.canJump = false;
 73                 if ((newEmptyPositonID - newFrog.position) > 0 && (newEmptyPositonID - newFrog.position) < 3 && newFrog.direction == frogDirection.向右)
 74                     newFrog.canJump = true;
 75 
 76                 if ((newFrog.position - newEmptyPositonID) > 0 && (newFrog.position - newEmptyPositonID) < 3 && newFrog.direction == frogDirection.向左)
 77                     newFrog.canJump = true;
 78 
 79                 newFrogQueue.Add(newFrog);
 80             }
 81             return newFrogQueue;
 82         }
 83 
 84         //是否已经完成位置对换,即前三个青蛙的位置都大于3
 85         private bool isComplete(List<Frog> frogQueue)
 86         {
 87             return (frogQueue[0].position > 3 && frogQueue[1].position > 3 && frogQueue[2].position > 3);
 88         }
 89 
 90         //是否还有可以跳动的青蛙,只要有可以跳动的,就没有达到最后的状态,但都不可以跳动了也不一定对换完了,这里只是控制递归
 91         private bool canFrogJump(List<Frog> frogQueue)
 92         {
 93             foreach (Frog frog in frogQueue)
 94             {
 95                 if (frog.canJump)
 96                     return true;
 97             }
 98             return false;
 99         } 
100         #endregion
101 
102         /// <summary>
103         /// 获取青蛙的跳动步骤
104         /// </summary>
105         /// <param name="frogQueue">当前青蛙队列</param>
106         /// <param name="emptyPositionId">空位置编号</param>
107         /// <returns></returns>
108         public string frogJump(List<Frog> frogQueue, int emptyPositionId)
109         {
110             string frogJumpInfo = "";
111 
112             foreach (Frog frog in frogQueue)
113             {
114                 //是空位置               
115                 if (frog.isEmpty)
116                     continue;
117                 if (!frog.canJump)
118                     continue;
119 
120                 frogJumpInfo = "青蛙" + frog.frogName + " " + frog.direction + "跳到" + (emptyPositionId + 1).ToString() + "\r\n";
121 
122                 int newPositionId = frog.position;
123                 List<Frog> newFrogQueue = this.editFrogQueue(frogQueue, frog.frogName, emptyPositionId, newPositionId);
124 
125                 //只要能继续跳就递归
126                 if (this.canFrogJump(newFrogQueue))
127                 {
128                     frogJumpInfo += this.frogJump(newFrogQueue, newPositionId);
129                 }
130                 else
131                 {
132                     if (this.isComplete(newFrogQueue))
133                     {
134                         frogJumpInfo = frogJumpInfo + "成功";
135                         break;
136                     }
137                 }
138 
139                 if (frogJumpInfo.Contains("成功"))
140                     break;
141             }
142             //循环结束
143             return frogJumpInfo;
144         }
145 
146     }
147 
148     #region 辅助类
149     enum frogDirection { 向左, 向右 };
150     //青蛙类
151     class Frog
152     {
153         public string frogName;//青蛙名称
154         public int position;    //青蛙位置
155         public frogDirection direction; //青蛙跳动的方向
156         public bool canJump;//是否可以跳
157         public bool isEmpty = false; //是否是空格
158 
159         public Frog(int positon, string frogName, frogDirection direction, bool canJump)
160         {
161             this.position = positon;
162             this.frogName = frogName;
163             this.direction = direction;
164             this.canJump = canJump;
165         }
166 
167         public Frog(int positon)
168         {
169             this.frogName = "空";
170             this.position = positon;
171             this.canJump = false;
172             this.isEmpty = true;
173         }
174         public Frog(Frog frog)
175         {
176             this.position = frog.position;
177             this.frogName = frog.frogName;
178             this.direction = frog.direction;
179             this.canJump = frog.canJump;
180             this.isEmpty = frog.isEmpty;
181         }
182     } 
183     #endregion
184 }
185

186

游戏和代码下载

网上找到的一个算法

private void button1_Click(object sender, EventArgs e)

{

int[] begintArray = new int[] { 1, 1, 1, 0, 2, 2, 2 };

int[] endArray = new int[] { 2, 2, 2, 0, 1, 1, 1 };

//最后的解,最先移动的排在最后

List<string> jumpStep = new List<string>();

jump(begintArray, endArray, jumpStep);

//反转一下得到正序的解

jumpStep.Reverse();

foreach (string step in jumpStep)

Console.WriteLine(step);

}

private bool jump(int[] begintArray, int[] endArray, List<string> jumpStep)

{

if (compareArray(begintArray, endArray))

return true;

int zeroIndex = Array.IndexOf(begintArray, 0);

int[] moveTo = zeroCanMoveTo(begintArray, zeroIndex);

//穷举所有可以移动的位置

foreach (int moveStep in moveTo)

{

int[] newBegin = (int[])begintArray.Clone();

newBegin[zeroIndex] = newBegin[moveStep];

newBegin[moveStep] = 0;

if (jump(newBegin, endArray, jumpStep))

{

string steplog = "";

for (int i = 0; i < newBegin.Length; i++)

steplog += newBegin[i].ToString();

jumpStep.Add(steplog);

return true;

}

}

return false;

}

//判断0可以移动到那些格

private int[] zeroCanMoveTo(int[] begintArray, int zeroIndex)

{

List<int> moveTo = new List<int>();

if (zeroIndex >= 1 && begintArray[zeroIndex - 1] == 1)

moveTo.Add(zeroIndex - 1);

if (zeroIndex >= 2 && begintArray[zeroIndex - 2] == 1)

moveTo.Add(zeroIndex - 2);

if (zeroIndex < begintArray.Length - 1 && begintArray[zeroIndex + 1] == 2)

moveTo.Add(zeroIndex + 1);

if (zeroIndex < begintArray.Length - 2 && begintArray[zeroIndex + 2] == 2)

moveTo.Add(zeroIndex + 2);

return moveTo.ToArray();

}

//比较两个数组是否相等

private bool compareArray(int[] begintArray, int[] endArray)

{

for (int i = 0; i < begintArray.Length; i++)

{

if (begintArray[i] != endArray[i])

return false;

}

return true;

}

转载于:https://www.cnblogs.com/zhaobl/archive/2009/02/26/1398451.html

青蛙过河 C# 求解相关推荐

  1. 编程求解机械迷城第11关中类青蛙过河的问题

    在玩机械迷城游戏的时候,第11关遇到一个类似青蛙过河的游戏http://jingyan.baidu.com/article/e73e26c014903024adb6a7a4.html,下图是三张地图的 ...

  2. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  3. 蓝桥杯青蛙过河(动态规划)

    1. 问题描述: 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的 ...

  4. 两个各四只青蛙过河java_趣味算法——青蛙过河(JAVA)

    /*** 青蛙过河 *@authorrubekid **/ public classRiverFrog {public static final int LEFT_FROG = -1;public s ...

  5. nyoj-619 青蛙过河

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=619 题目大意:就是有一条宽为L的河,河上有n个石头,每个石头与河对岸的距离为a[i],然 ...

  6. P1244 青蛙过河

    P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,-,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过 ...

  7. 青蛙过河 猴子爬山 兔子繁殖 开宝箱2 找气球 指针函数 铺地砖

    Problem A: 青蛙过河 Description 一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚.有一队青 ...

  8. 2022-01-19:青蛙过河。 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列

    2022-01-19:青蛙过河. 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子,但是不可以跳入水中. 给你石子的位置列 ...

  9. html5青蛙过河,[推荐]===PS4上的本地多人游戏推荐心得===家庭聚会,欢乐时光 (持续更新)...

    本帖最后由 everyer 于 2018-11-25 22:22 编辑 更新: =============经典派对小游戏合集============= Arcade Islands: Volume O ...

最新文章

  1. 播放此电影需要以下插件,但尚未安装: MPEG-4 AAC decoder
  2. .NET开源工作流驰ccflow从表数据数据源导入设置
  3. 如何在Jsp上传图片
  4. Netty HTTP on Android
  5. 17---Net基础加强
  6. iOS之UITraitCollection
  7. matlab kfda,SVD与KFDA相结合人脸识别-matlab-毕业论文
  8. python的if和else、for、while语法_python-变量、if else语句 、for循环、while循环(4月26号)...
  9. ES6新特性_ES6模板字符串---JavaScript_ECMAScript_ES6-ES11新特性工作笔记007
  10. 超高并发优化技能001--隔离
  11. 【学习随笔】iquery初涉
  12. Java+Selenium实现网页截图
  13. 软件推荐!真正免费的思维导图软件,全在这里了!
  14. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
  15. 源代码管理工具——VSS详解
  16. Pycharm 2017.3 最新的激活码
  17. Fluent验证案例17:RAE2822翼型
  18. 计算机考研科目 英语怎么说,计算机考研科目和专业
  19. 编程字体Source Code Pro 安装
  20. 手把手带你用next搭建一个完善的react服务端渲染项目(集成antd、redux、样式解决方案)

热门文章

  1. 高等数学——向量应用二空间直线
  2. Android自动化测试,5个必备的测试框架
  3. 网页前端代码存档 - 【第三期】全屏banner图片切换特效详解
  4. Sublime--插件
  5. 「优知学院」淘宝架构的前世今生(下)
  6. C语言表达式和表达式的值
  7. 如何将验证码添加到Android应用
  8. 学生信息管理页面HTML+CSS+JavaScript基础开发
  9. spring如何排除bean的注入
  10. 基于ISA/TMG的双线接入