杭電1195 搜尋

2021-08-04 02:56:07 字數 1601 閱讀 9539

題意: 有乙個密碼鎖,給定了當前狀態和正確的狀態。求到達目的狀態所需的最小步數。每一步只能這樣做:對某位數加1,對某位數減1,交換相鄰兩數的位置。

之前做的都是在矩陣上進行bfs,這次突然轉成這樣了都不會做了。但其實思路還都是一樣的。

原來的矩陣,搜尋時要往四個方向找,現在需要往11個方向搜尋,這就是「狀態轉移」的不同的地方。

原來矩陣的每個元素作為乙個node,需要給定元素的座標和當前step。在這裡需要給定當前的狀態,也就是由原來的兩個變數定位該node變成了四個變數定位該node。

原來的visited陣列儲存每個座標的元素有沒有被訪問過,所以這次變成了四維陣列。

還有一點需要注意的是,和原來一樣,這次我用乙個陣列dis儲存原狀態到每個狀態的step,最後再直接從dis陣列中直接拿到答案。還可以用另一種方法,就是當判斷到狀態轉移之後的node是目的狀態時,直接退出迴圈,將當前的step輸出即可。

下面是ac**:

//#include "stdafx.h"

#include

#include

#include

#include

#include

#include "stdio.h"

using

namespace

std;

int a[4], b[4];

int visited[10][10][10][10];

int dis[10000];//四位密碼最多有10000個狀態,這裡儲存到每個狀態的step

//其實,這裡也可以在next那裡直接判斷,看是不是目標狀態,如果到達目標狀態,就直接退出迴圈。

//int ans; //用另外一種方法(找到目標狀態直接返回,就儲存到乙個ans中即可

struct node

node(int n1, int n2, int n3, int n4, int step1)

};node change(node t, int i)

else

if (i < 8)

else

return retur;

}void bfs(node nod) */

for (int i = 0; i < 11; i++) }}

}int main()

memset(visited, 0, sizeof(visited));

node start(a[0], a[1], a[2], a[3], 0);

//與原來的矩陣搜尋不一樣,這個一共有11種操作,而之前的矩陣是上下左右四種操作。

//還有乙個不一樣的地方是,矩陣的每個元素作為乙個node,該結構體中有兩個座標和乙個step

//但是這個每個node作為一種狀態,是有四個元素的狀態和乙個step。

bfs(start);

int ans = b[0] * 1000 + b[1] * 100 + b[2] * 10 + b[3]; //所有狀態都bfs一遍之後,dis也就儲存完了,然後直接從dis陣列中拿目標狀態的step就可以了。

ans = dis[ans];

cout

<< ans << endl;

}}

杭電ACM substrings(搜尋)

本題應學會如何將字串的子串全部羅列出來。要設定三重循壞 僅限資料小的情況 include includeint main for i 0 i min 1 i for j i j min 1 j printf s n s n s1,s2 在某些可能出錯的資料後新增乙個輸出語句,方便dig bug s1...

深度搜尋dfs 杭電

1.判斷放入goal能否符合 2.由於要找出最多滿足條件的goal的個數,因而採用dfs法,在放入goal的情況下進入下一層dfs,然後還原即回溯 這層的dfs沒有goal include include using namespace std const int maxnum 10000 int ...

廣度搜尋bfs (杭電)

1.優先佇列 按時間優先 時間小的先出佇列 可以使英雄更快的救出公主 2.最後輸出的時候 採用遞迴 include include include include include using namespace std struct points char map 100 100 points fl...