资源简介
用C#写的马的极小满覆盖问题:
在8×8的国际象棋棋盘上,如果在放置若干个马以后,使得整个棋盘的任意空位置上所放置的棋子均能被这些马吃掉,则称这组放置为棋盘的一个满覆盖。若去掉满覆盖中的任意一个棋子都会使这组放置不再是满覆盖,则称这一满覆盖为极小满覆盖。
求解一个极小满覆盖,按照矩阵形式给出,用特殊符号表示马。
代码片段和文件信息
/*
* 程序参考:https://max.book118.com/html/2015/0619/19399060.shtm 数据结构课程设计报告--马儿覆盖问题.doc
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
class Program
{
/*以下变量为全局信息,各个函数可以调用*/
static private int M;//棋盘长
static private int N;//棋盘宽
static List directionList;//方向列表,存储马可走的8个方向
static Dictionary chessboard;//棋盘状态,Postion代表棋盘位置,int代表是否有子。如果为0,表示未占用,为1表示占用。M*N个元素可以代表整个棋盘信息
static Postion startPostion;//遍历的起始点
static List horseHome;//存储运算结果马所在的位置列表
//获得周围可行格子坐标(最多8个)
static List getValiablePos(Postion postion)
{
List valiablelist=new List();
//向周围8个方向遍历,如果新探索位置(newPostion)在棋盘外,则不予记录,否则放到可行列表中
foreach(var i in directionList)
{
Postion newPostion = new Postion(postion + i);
if (chessboard.ContainsKey(newPostion))
valiablelist.Add(newPostion);
}
return valiablelist;
}
//获得周围八个格子中马的数量
static int getValiableNum(Postion postion)
{
int num = 0;
foreach(var i in directionList)
{
Postion tempPostion = new Postion(postion + i);
//tempPostion在棋盘上且此位置有马,则记录
if(chessboard.ContainsKey(tempPostion))
{
if (chessboard[tempPostion] ==1)
num++;
}
}
return num;
}
//核心算法
static void find(Postion myPostion)
{
List ableList = getValiablePos(myPostion);
//条件一:拿掉当前位置的马后,周围马的周围必须至少有一个马
foreach(var i in ableList)
{
if (getValiableNum(i) - 1 <= 0)
return;
}
//条件二:拿掉当前位置的马后,自己位置周围至少有一个马
if (getValiableNum(myPostion) > 0)
{
chessboard[myPostion] = 0;//满足两个条件后,可以拿掉当前位置的马
horseHome.Remove(myPostion);
draw();
}
}
//通过chessboard画棋盘
static void draw()
{
Console.Clear();
int number=0;
String str = ““;
foreach(var i in chessboard)
{
str += i.Value;
str += “ “;
if((number+1)%M==0)
{
str += “\n“;
}
number++;
}
Console.WriteLine(str);
Thread.Sleep(200);//可以看到执行过程
}
static void Main(string[] args)
{
init();
//对棋盘上的每一个位置用find()来决定是否将当前位置的马拿下去。
List newBoard = new List(chessboard.Keys);//chessboard运行中会变动,不能用于枚举,要用newBoard作中间变量
foreach (v
相关资源
- C# 调用win32 api函数-user32.dll详细说明
- C# 调用BarTender打印条码DEMO
- 大型比赛竞赛抽签系统 可打印 c# vs
- C#编写的Gerber查看器
- lua C# .Net4.0 vs2010 LuaInterface
- C#十六进制编辑器
- 明华URF-35H读卡器 C#读写源码 为大家
- C#文件流读取CSV文件
- c#读写PDF文件sql
- C# winform Socket大文件传输
- c#车牌识别系统附30张测试图片
- 《C#面向对象程序设计》源代码(CS)
- 金旭亮《C#面向对象程序设计》教案
- 试题库管理系统毕业论文(C#)源程序
- 学校网站原代码(C#.NET)
- C#-数据库操作技术-员工管理系统
- c#web开发入门经典
- C#与Matlab混合编程的几种方式
- c# 开发与 mysql数据库实现的增删改查
- C#异步操作 异步查询数据库 异步处理
- Basler相机通过IO触发源码
- [源代码] 《领域驱动设计 (C# 2008 实
- 松下PLC与C#通讯串口调试入门教程.z
- USB 继电器控制器 LCUS-1 保证能用 c#
- C# AES加密解密小工具
- C#圆形按钮,非常漂亮动态~~
- [精]C#仿QQ右下角弹出提示框()
- C#进程间通信-共享内存代码
- 有史以来最简单的三层(C#)
- vb调用c#编写的串口DLL文件(vb源码
评论
共有 条评论