藍橋杯T42 八數碼問題

2022-02-19 22:15:11 字數 1985 閱讀 5393

題意:中文題誒~

思路:bfs

將沒種九宮格的狀態看作乙個狀態節點,那麼只需求起始節點到目標節點的最短路徑即可,可以用bfs解決。

**:

1 #include 2 #include 

3 #include

4 #include 5 #include 6

#define maxn 9

7using

namespace

std;89

struct

node17}

18return r.matrix[0]0

];19}20

};21

22const

int dir[4][2]=;//

記錄方向

23 mapbool> mp;//

標記節點

2425

bool is_ok(node q, node e)30}

31return

true;32

}3334void scan(string str, node &r)else43}

44}4546

int bfs(node s, node e)

54int

gg[maxn];

55while(!q.empty())

74 mp[cc]=true;//

標記75 q.push(cc);//

入隊76}77

}78}79 ans++;80}

81return -1;82

}8384int main(void

)

view code

如果步數比較多的話,可以用陣列模擬佇列

**:

1 #include 2 #include 

3using

namespace

std;

45 typedef int state[9]; //

定義狀態類

6const

int maxn=1e6+10;7

const

int hashsize=1e6+3

;8 state st[maxn], goal; //

狀態陣列

9int dist[maxn]; //

距離陣列

10int

head[hashsize], next[hashsize];

1112

const

int dx=;

13const

int dy=;

1415

int hash(state& s)

20return v%hashsize;21}

2223

int try_to_insert(int

s)30 u=next[u];31}

32 next[s]=head[h];

33 head[h]=s;

34return1;

35}3637

void

init()

4041

int bfs(void)

49int

z;50

for(z=0; z<9; z++)54}

55int x=z/3, y=z%3;56

for(int i=0; i<4; i++)68}

69}70 front++; //

擴充套件完畢後再修改隊首指標71}

72return0;

73}7475

int main(void

)else84}

85for(int i=0; i<9; i++)else91}

92int ans=bfs();

93if(ans>0

)else

98return0;

99 }

view code

藍橋杯 九宮重排(八數碼問題)

歷屆試題 九宮重排 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為...

藍橋杯 BFS 八數碼問題(演算法筆記8)

題目中輸入初始狀態和目標狀態,返回最少的移動步數。這與迷宮問題的最短路勁有些許相似,但這裡更多的是一種狀態的思考,本題涉及到 康托展開 這個特殊的雜湊函式。但是,思路有了不代表能做對,因為ac還要考慮時間複雜度,空間複雜度問題,不過一般空間複雜度都沒太大的問題。那麼為什麼這裡說不能做對?這裡參考書上...

C 實現 藍橋杯 演算法提高 八數碼

藍橋杯試題解答彙總鏈結 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 rxy八數碼,給出初始狀態和目標狀態,通過移動數字0 可上 下 左 右方向移動一格 使初始狀態變為目標狀態,求最少移動多少步?輸入格式 輸入兩個3 3 第乙個為目標 第二個為檢索 輸出格式 輸出最少移動步數 ...