的确,时间能改变一切。不过从物理学的角度来说,时间的作用的确是改变一切,因为对一个事物而言,不同状态总是在不同的时间才有意义。
今天解决了用程序实现野人过河的问题了,感觉很不错。
程序运行的界面如下:
问题描述:
有M个传教士和N个野人来到河边渡河,河岸有Q条船,每次至多可供K人乘渡。问传教士为了安全起见,应如何规划摆渡方案,使得任何时刻,河两岸以及船上的野人数目总是不超过传教士的数目(否则不安全,传教士有可能被野人吃掉)。即求解传教士和野人从左岸全部摆渡到右岸的过程中,任何时刻满足M(传教士数)≥C(野人数)和M+C≤k的摆渡方案。
本程序只讨论N=M为3、k为2Q=1乘渡问题.程序用C#编写,主要算法代码为:
if((nowstate[0]>=oper[i,0]&&nowstate[1]>=oper[i,1])||(((nowstate[0]+oper[i,0])<=_I[0])&&((nowstate[1]+oper[i,1])<=_I[1])))
//将该状态中的传教士人数和野人数目与当前操作进行比较,判断能不能进行操作 if(((nowstate[0]-oper[i,0])>=(nowstate[1]-oper[i,1]))||((nowstate[0]-oper[i,0])==0))//判断操作后的状态是否正常
{
if(OP_type=="OR")
{根据左操作和右操作进行操作
tempstate=new int[]{(nowstate[0]-oper[i,0]),(nowstate[1]-oper[i,1]),0};
}
else
{
tempstate=new int[]{(temp_nowstate[0]+oper[i,0]),(temp_nowstate[1]+oper[i,1]),1};
}//在状态空间内判断该准状态是否是合法的状态
if(_ContainsStack(_project_state,tempstate))
{continue;}
for(int state=0;state<this._S.GetLongLength(0);state++)
{
int []d=_S[state];
if(this._equalarray(d,tempstate))
{//判断两个数组是否相等
this._project_state.Push(tempstate);
return true;进行操作并返回
}
}
}
}
==================
///问题说明:假设3个传教士和3个野人一起过河,船的载重为2,开始所有的人和物在左岸
///S:所有合法状态 {传教士数,野人数,船状态};
///O包含:PL,PR。PL:左操作;PR:右操作;{} {传教士数,野人数}
///I:问题的初始状态;G:问题的目标状态。I,G都必须在S集合中。
int [][] _S:用来存合法状态集
int [,] _PL, int [,] _PR:用来存储操作集
int [] _I, int [] _G:用来存储初始状态和解状态
Stack _project_state:用来存储解的过程
///问题说明:假设3个传教士和3个野人一起过河,船的载重为2,开始所有的人和物在左岸
///S:所有合法状态 {传教士数,野人数,船状态};
///O包含:PL,PR。PL:左操作;PR:右操作;{} {传教士数,野人数}
///I:问题的初始状态;G:问题的目标状态。I,G都必须在S集合中。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace uncivilized_Problem
... {
/**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
...{
...#region
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox_uncivilized_num;
private System.Windows.Forms.TextBox textBox_churchman;
private System.Windows.Forms.Button button_formatdata;
private System.Windows.Forms.RichTextBox richTextBox_resuilts;
private System.Windows.Forms.TextBox textBox_boatload;
private int _uncivilizednum=0;
private int _churchmannum=0;
private int _boatload=0;
private int [][] _S=...{ new int []...{ 3,3,1},new int []...{ 3,2,0},new int []...{ 2,2,0},new int []...{ 3,2,1},
new int []...{ 3,1,0},new int []...{ 3,0,0},new int []...{ 3,1,1},new int []...{ 1,1,0},
new int []...{ 2,2,1},new int []...{ 0,2,0},new int []...{ 0,3,1},new int []...{ 0,1,0},
new int []...{ 1,1,1},new int []...{ 0,1,1},new int []...{ 0,0,0},new int []...{ 0,2,1}};
private int [,] _PL=new int[5,2]...{ ...{ 2,0},...{ 1,0},...{ 1,1},...{ 0,1},...{ 0,2}};
private int [,] _PR=new int[5,2]...{ ...{ 0,2},...{ 0,1},...{ 1,1},...{ 1,0},...{ 2,0}};
private int [] _I=new int[]...{ 3,3,1};
private int [] _G=new int[]...{ 0,0,0};
private Stack _project_state=new Stack();
//