91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 5KB
    文件類型: .cs
    金幣: 1
    下載: 1 次
    發布日期: 2021-06-25
  • 語言: C#
  • 標簽: C#??極小??滿覆蓋??

資源簡介

用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

評論

共有 條評論