題意:中文題誒~
思路:bfs
將沒種九宮格的狀態看作乙個狀態節點,那麼只需求起始節點到目標節點的最短路徑即可,可以用bfs解決。
**:
1 #include 2 #includeview code3 #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
)
如果步數比較多的話,可以用陣列模擬佇列
**:
1 #include 2 #includeview code3using
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 }
藍橋杯 九宮重排(八數碼問題)
歷屆試題 九宮重排 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為...
藍橋杯 BFS 八數碼問題(演算法筆記8)
題目中輸入初始狀態和目標狀態,返回最少的移動步數。這與迷宮問題的最短路勁有些許相似,但這裡更多的是一種狀態的思考,本題涉及到 康托展開 這個特殊的雜湊函式。但是,思路有了不代表能做對,因為ac還要考慮時間複雜度,空間複雜度問題,不過一般空間複雜度都沒太大的問題。那麼為什麼這裡說不能做對?這裡參考書上...
C 實現 藍橋杯 演算法提高 八數碼
藍橋杯試題解答彙總鏈結 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 rxy八數碼,給出初始狀態和目標狀態,通過移動數字0 可上 下 左 右方向移動一格 使初始狀態變為目標狀態,求最少移動多少步?輸入格式 輸入兩個3 3 第乙個為目標 第二個為檢索 輸出格式 輸出最少移動步數 ...