zoukankan      html  css  js  c++  java
  • 双向宽度优先搜索

    这种搜索仅限于解决起始状态和结束状态可以互换的问题之中,也就是从头搜到尾和从尾搜到头是等价的

    移动一个只含字母A和B的字符串中的字母,给定初始状态为(a)表,目标状态为(b)表,给定移动规则为:只能互相对换相邻字母。请找出一条移动最少步数的办法

    NKOJ1688移字母游戏

    一通好找啊

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<map>
     4 #include<queue>
     5 using namespace std;
     6 string s1,s2;
     7 map<string,int>vis;
     8 map<string,int>step;
     9 queue<string>q[2];
    10 int len;
    11 int bfs(){
    12     q[0].push(s1);vis[s1]=1;step[s1]=0;
    13     q[1].push(s2);vis[s2]=2;step[s2]=0;
    14     while(q[0].size()&&q[1].size()){
    15         int t,i;
    16         string x,y;
    17         t= q[0].size()>=q[1].size();
    18         x=q[t].front();q[t].pop();
    19         y=x;
    20         for(i=1;i<len;i++)
    21             if(x[i]!=x[i-1]){
    22                 swap(y[i],y[i-1]);
    23                 if(vis[x]&&vis[y]&&vis[x]!=vis[y])return step[x]+step[y]+1;
    24                 if(!vis[y]){
    25                     vis[y]=vis[x];
    26                     step[y]=step[x]+1;
    27                     q[t].push(y);
    28                 }                 
    29                 y=x;   
    30             }
    31     }
    32 }
    33 int main(){
    34     cin>>s1>>s2;
    35     len=s1.length();
    36     cout<<bfs();
    37 }
  • 相关阅读:
    【3006】统计数字
    【5001】n皇后问题
    【7001】n阶法雷序列
    【9402】倒序数
    【9705】&&【a801】细胞
    【9802】闭合曲线面积
    【a803】营救
    【9112】求2的n次方的精确值
    V8引擎实现标准ECMA-262(三)
    仔细看看Javascript中的逻辑与(&&)和逻辑或(||)
  • 原文地址:https://www.cnblogs.com/aininot260/p/9627437.html
Copyright © 2011-2022 走看看