element-ui 彈窗元件封裝的步驟
阿新 • • 發佈:2021-01-25
【藍橋杯】跳蚱蜢
題目連線http://oj.ecustacm.cn/problem.php?id=1318
1.1建模
直接讓蚱蜢跳到空盤有點麻煩,因為有很多蚱蜢在跳,跳暈了。如果看成空盤跳到蚱蜢的位置就簡單多了,只有一個空盤在跳。
題目給的是一個圓圈,不好處理,此時祭出一個建模大法:“化圓為線”! 把空盤看成0,那麼有9個數字{0,1,2,3,4,5,6,7,8},一個圓圈上的9個數字,拉直成了一條線上的9個數字。
等等,這不就是八數碼問題嗎?八數碼是經典的BFS問題。
八數碼有9個數字{0,1,2,3,4,5,6,7,8},它有9!=362880種排列。也不多,
本題的初始狀態是“012345678”,終止狀態是“087654321”。
1.2程式碼的思路
這道題要採用的是BFS來遍歷,每一個結點有四個根節點,層次遍歷過去,佇列的一個點是用結構體表示,存放的是字串和當前的總步驟,當出現087654321的時候就結束,另外,要用一個map來判重,map<string,bool>mp;如果是false(沒出現過該串),則標記為false並且加入佇列中去,整體主要思路差不多這樣。
1.3完整程式碼
#include<bits/stdc++.h>
using namespace std;
struct node{
string s;
int t;
node (){}
node(string ss,int tt)
{
s=ss;t=tt;
}
};
map<string,bool>mp;
queue <node> q;
void BFS_solve(){
while(!q.empty())
{
node now=q.front();
q.pop();
string s=now.s;int t=now.t;
if(s=="087654321")
{
cout<< t;
break;
}
int i;
for(i=0;i<10;i++)
{
if(s[i]=='0')
break;
}//找到字元0
for(int j=i-2;j<=i+2;j++)
{
int k=(j+9)%9;
if(k==i) continue;
char tmp;
tmp = s[i];s[i] = s[k];s[k] = tmp;//相當於0的位置在跳
if(!mp[s])//當前排列順序的串沒有被遍歷過
{ mp[s]=true;
q.push(node(s,t+1));
}
tmp=s[k];s[k]=s[i];s[i]=tmp;//廣度遍歷的一個點已經加入隊列了,要把串變回來才能繼續遍歷同層次的點
}
}
}
int main()
{
string s="012345678";
node n0=node(s,0);
q.push(n0);
mp[s]=true;
BFS_solve();
}