1. 程式人生 > 其它 >藍橋杯演算法提高智慧體系列賽

藍橋杯演算法提高智慧體系列賽

題目連結:http://lx.lanqiao.cn/problem.page?gpid=T2993

思路很明確的搜尋題,對於搜尋題只要是主要好了題目要求並且按照題目要求去做就可以;

這個題需要注意的是一些地方的優化,比如開始的時候我們如果走過了,意思就是說已經走完了並且找到了最小的步驟,如果要是繼續走就不值得了;

然後還有就是如果已經走完了就走的步數是最小的;

回溯就不多說了老生常談;

 1 #pragma GCC optimize(3)
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int sx,sy;
 5 int x[20
]; 6 int y[20]; 7 bool vis[20];//標記陣列 8 int n; 9 int Min=INT_MAX;//哨兵先設最大值 10 void dfs(int sx,int sy,int step,int cnt)//step表示當前的步數,cnt表示計數器 11 { 12 if(step>Min)//如果當前搜尋步數已經大於之前的步數,那麼就沒有意義了 13 { 14 return ; 15 } 16 if(cnt==n)//搜完了所有的點 17 { 18 Min=min(Min,step); 19 }
20 for(register int i=1;i<=n;i++) 21 { 22 if(vis[i]==false)//沒走的過點才可以走 23 { 24 step+=(abs(sx-x[i])+abs(sy-y[i]));//步數 25 cnt++;//記錄走過的點數 26 vis[i]=true;//記錄走過的點 27 dfs(x[i],y[i],step,cnt); 28 //回溯 29 step-=(abs(sx-x[i])+abs(sy-y[i]));
30 cnt--; 31 vis[i]=false; 32 } 33 } 34 } 35 int main() 36 { 37 ios::sync_with_stdio(false); 38 cin>>sx>>sy; 39 cin>>n; 40 for(register int i=1;i<=n;i++) 41 cin>>x[i]>>y[i]; 42 dfs(sx,sy,0,0); 43 cout<<Min<<endl; 44 return 0; 45 }