当前位置:   article > 正文

备战蓝桥杯---搜索(应用入门)

备战蓝桥杯---搜索(应用入门)

话不多说,直接看题:

显然,我们可以用BFS,其中,对于判重操作,我们可以把这矩阵化成字符串的形式再用map去存,用a数组去重现字符串(相当于map映射的反向操作)。移动空格先找到x的位置再推算出在矩阵里的位置进行移动即可。

至于如何回溯,我们创造last数组来看它上一个是谁,用form数组记录变化的操作。

然后dfs回溯输出即可。

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 363000
  4. int last[N],cnt;
  5. int form[N];
  6. char dd;
  7. map<string,int> mp;
  8. string a[N],s1,s2="12345678x";
  9. queue<int> q;
  10. int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
  11. char ck[4]={'r','l','u','d'};
  12. int bfs(string s1,string s2){
  13. mp[s1]=1;
  14. cnt=1;
  15. last[cnt]=0;
  16. a[cnt]=s1;
  17. q.push(cnt);
  18. while(!q.empty()){
  19. int tmp=q.front();
  20. q.pop();
  21. int tt=a[tmp].find('x');
  22. int x=tt/3,y=tt%3;
  23. for(int i=0;i<4;i++){
  24. string nxt=a[tmp];
  25. int x1=x+dir[i][0];
  26. int y1=y+dir[i][1];
  27. if(x1<0||x1>=3||y1<0||y1>=3) continue;
  28. swap(nxt[tt],nxt[x1*3+y1]);
  29. if(mp.find(nxt)!=mp.end()) continue;
  30. mp[nxt]=++cnt;
  31. last[cnt]=tmp;
  32. form[cnt]=i;
  33. a[cnt]=nxt;
  34. q.push(cnt);
  35. if(nxt==s2) return 1;
  36. }
  37. }
  38. return 0;
  39. }
  40. void dfs(int cnt){
  41. if(cnt==1) return;
  42. dfs(last[cnt]);
  43. cout<<ck[form[cnt]];
  44. }
  45. int main(){
  46. for(int i=1;i<=9;i++){
  47. cin>>dd;
  48. s1+=dd;
  49. }
  50. if(bfs(s1,s2)==0) cout<<"unsolvable";
  51. else dfs(mp[s2]);
  52. }

注意:方向数组中(1,0)是down(因为这wa了好久)

下面来一道刚刚比赛过的题:

这名字显然是个坑,看到数据范围就知道要暴力了3^10是可以接受的,于是我们用dfs写

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,t,a[20],min1=20;
  4. struct node{
  5. int u,v;
  6. }q[20];
  7. void deal(){
  8. int cnt=1;
  9. for(int i=2;i<=n;i++){
  10. if(a[i]>a[1]) cnt++;
  11. }
  12. min1=min(min1,cnt);
  13. }
  14. void dfs(int x){
  15. if(x>m){
  16. deal();
  17. return ;
  18. }
  19. for(int i=1;i<=3;i++){
  20. if(i==1){
  21. a[q[x].u]+=3;
  22. dfs(x+1);
  23. a[q[x].u]-=3;
  24. }
  25. else if(i==2){
  26. a[q[x].v]+=3;
  27. dfs(x+1);
  28. a[q[x].v]-=3;
  29. }
  30. else{
  31. a[q[x].u]+=1;
  32. a[q[x].v]+=1;
  33. dfs(x+1);
  34. a[q[x].u]-=1;
  35. a[q[x].v]-=1;
  36. }
  37. }
  38. return ;
  39. }
  40. int main(){
  41. cin>>t;
  42. while(t--){
  43. cin>>n>>m;
  44. for(int i=1;i<=n;i++) cin>>a[i];
  45. for(int i=1;i<=m;i++) cin>>q[i].u>>q[i].v;
  46. dfs(1);
  47. cout<<min1<<endl;
  48. min1=20;
  49. }
  50. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据科学灵魂/article/detail/60544
推荐阅读
相关标签
  

闽ICP备14008679号