青蛙跳杯子
bfs,需要注意用set记录走过的局面,我用的是set<string> condition,看其他人的博客有用set<string> visited 的,变量名起得更加贴切
只要注意这个点,细心一点就可以AC了
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <string.h> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 3000 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; struct Node{ string s; int p; Node(string s="",int p=0):s(s),p(p){ } }; string sswap(string s,int a,int b){ char t=s[a]; s[a]=s[b]; s[b]=t; return s; } queue<Node> q; set<string> condition; void insertNode(int p,int d,string s){ string tmp=sswap(s,p,p+d); if(condition.find(tmp)==condition.end()){ //找到 condition.insert(tmp); q.push(Node(tmp,p+d)); } } int main(){ // freopen("D:/CbWorkspace/blue_bridge/青蛙跳杯子.txt","r",stdin); char buf[20]; I("%s",&buf); string s(buf); I("%s",&buf); string e(buf); Node root(s,s.find('*')); q.push(root); int len=s.length(),i; int cnt=0; int n=s.size(); while(!q.empty()){ // cnt++; int size=q.size(); for(i=0;i<size;i++){ Node node=q.front(); q.pop(); if(node.s==e) goto END; int p=node.p; s=node.s; if(p-1>=0) insertNode(p,-1,s); if(p-2>=0) insertNode(p,-2,s); if(p-3>=0) insertNode(p,-3,s); if(p+1<n) insertNode(p,1,s); if(p+2<n) insertNode(p,2,s); if(p+3<n) insertNode(p,3,s); } cnt++; } END: printf("%d\n",cnt); return 0; }