POJ3087 Shuffle'm Up

题目大意&&思路:

单方向查找某个目标,也算是搜索,只不过是单向搜索

BFS。

小小的用了一下MAP

AC program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<map>
using namespace std;
int n;
string str1,str2,strpp;
int cas,cnt;
struct node
{
  string ss;       
}ans,tmp;
string fn(string s1,string s2)//合成函数 
{
   
  char tmp[2005];//string tmp;//2*n;
  //一开始用string直接存储竟然有问题,囧 
  memset(tmp,0,sizeof(tmp));
  int t1=0,t2=0;
  for(int i=0;i<2*n;i++)
  {
    if(i&1)tmp[i]=s1[t1++];
    else tmp[i]=s2[t2++];        
  }
  tmp[2*n]='\0';
  return tmp;       
}
void gn(string s1)//拆分函数 
{
  for(int i=0;i<n;i++)
     str1[i]=s1[i];
  for(int i=n;i<2*n;i++)
     str2[i-n]=s1[i];//注意下标     
}
void bfs()
{
   queue<node> que;
   map<string,int> mm;
   ans.ss=fn(str1,str2);
   que.push(ans);
   mm[ans.ss]++;//直接利用map的int下标来做标记 
   cnt=1;
   while(!que.empty())
   {
      ans=que.front();
      que.pop();
      if(!ans.ss.compare(strpp))
      {
         cout<<cas++<<" "<<cnt<<endl;
         return;                           
      }         
      else
          {
             gn(ans.ss);
             tmp.ss=fn(str1,str2);
             if(!mm[tmp.ss])//没见过的则标记 
                 {
                   mm[tmp.ss]++;//标记
                   cnt++;
                   que.push(tmp); 
                               
                 }
             else  
                 {
                   cout<<cas++<<" "<<-1<<endl;
                   return ;
  //除了目标,其余的如果一循环,即还没找到目标就循环了话,以后也不会找到目标                                
  //对目标也不用考虑在这里会被排除,因为第一次见到目标早就成功返回了
  //这里只是捕捉其余的第二次见面 
                 }   
          }        
   }    
}
int main()
{
int test;
cin>>test;
cas=1;
while(test--)
{
   cin>>n;
   cin>>str1>>str2>>strpp;
   cnt=0;
   bfs();               
}
//cin>>test;
return 0;}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值