NOJ(1571) 分支限界 8數碼

2021-08-10 09:22:29 字數 1291 閱讀 6022

在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態(用0表示空格):

1 2 3

4 5 6

7 8 0

輸入乙個給定的狀態。

輸出到達目標狀態的最小步數。不能到達時輸出-1。

1 2 34 0 67 5 8

#include

#include

#include//用map來儲存狀態

using

namespace

std;

queue

q1;

map smap;//map是用來存放一組一一對映關係的,在map中,乙個x只能對應乙個y

//移動的四個方向

int dr[4] = ;

int dc[4] = ;

int readdata();

int bfs();

void init(int s);

int canmoveto(int u, int dire);

int moveto(int u, int dire);

int main()

int readdata()

return(s);

}void init(int s)

int bfs()

if(smap.count(v) == 0)//也就是說在map/set中不存在等價的兩個(以上)元素,

//因此某個元素在map/set中出現的次數最多只能為1,用count得到的結果不是0就是}}

}return(-1);

}int canmoveto(int u, int dire)//編碼}}

r = row + dr[dire];//根據dire的值來移動空格

c = col + dc[dire];

if(r >= 0 && r < 3 && c >= 0 && c < 3)//約束空格移動的範圍

else

}int moveto(int u, int dire)//解碼}}

r = row + dr[dire];

c = col + dc[dire];

b[row][col] = b[r][c];//交換 重新記錄0在9宮格中的位置

b[r][c] = 0;//把該位置的數值置為0

v = 0;//將以9宮格狀態存放的8數碼復現成數串

for(i = 0; i < 3; i++)

}return(v);//返回變換後的8數碼

}

NOJ 1541) 分支限界 加1乘2平方

問題描述 最簡單的佇列的使用 include include using namespace std queue q1 int main 給定兩個正整數m n,問只能做加1 乘2和平方這三種變化,從m變化到n最少需要幾次 輸入輸入兩個10000以內的正整數m和n,且m小於n 輸出輸出從m變化到n的最...

演算法實驗三 分支限界法 六數碼問題

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述現有一兩行三列的 如下 a b c d e f 把1 2 3 4 5 6六個數字分別填入a b c d e f格仔中,每個格仔乙個數字且各不相同。每種不同的填法稱為一種布局。如下 1 3 5 2 4 6 布局12 5 6 4 3...

演算法入門7 分支限界法

中已經提到過,回溯法的思想是深度優先搜尋加剪枝,與之相對,分支限界法的思想是廣度優先搜尋加剪枝。1.分支限界法 廣度優先搜素 1.簡單概述 分支限界法思路的簡單描述是 把問題的解空間轉化成了圖或者樹的結構表示,然後使用廣度優先搜尋策略進行遍歷,遍歷的過程中記錄和尋找所有可行解或者最優解。基本思想類同...