2017-09-25 19:58:04
writer:pprp
题意看上去很难很难,但是耐心看看还是能看懂的,给你n位数字
你可以交换第一位和之后的某一位,问你采用最少的步数可以交换成目标
有五组数据
用BFS进行搜索,并进行剪枝,已经搜索过的点不再搜索
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <set> #include <queue> using namespace std; string sa, sb; int n; struct node { string str; int times; node() { str = ""; times = 0; } }; int bfs() { queue<node> q; set<string> ss; node now , nex; now.str = sa; q.push(now); ss.insert(now.str); while(!q.empty()) { now = q.front(); q.pop(); if(now.str == sb) return now.times; for(int i = 1; i < n;i++) { nex.str = now.str; nex.times = now.times+1; nex.str[i] = now.str[0]; nex.str[0] = now.str[i]; if(ss.count(nex.str) == 0) { ss.insert(nex.str); q.push(nex); } else continue; } } } int main() { cin >> n; for(int i = 0 ; i < 5 ;i++) { cin >> sa >> sb; cout << bfs() << endl; } return 0; }
现阶段掌握搜索还不是太好,希望以后可以尽快掌握
时间: 2024-11-07 11:39:43