HDU 1430+BFS

来源:互联网 发布:剑灵捏脸数据灵男数据 编辑:程序博客网 时间:2024/06/01 10:09
这道题一看,暴力bfs去搞,超时,康拓hash下还是超时,结果看大牛博客,才知道。。对于一个状态到另一个状态都可以转化为12345678到另一个状态,中间只需置换下即可,这样的话,只要一次bfs预处理出所有情况就可以了。。不需要每个case都搜一遍。。。
#include<cstdio>#include<queue>#include<map>#include<string>#include<algorithm>#include<iostream>using namespace std;struct node{string str;string step;int va;};string s,t;int vi[50000];string dp[50000];int pos[10];int func[10];int hash(string &s){int va=0;for(int i=0;i<7;i++){int cnt=0;for(int j=i+1;j<8;j++)if(s[j]<s[i])cnt++;va+=cnt*func[7-i];}return va;}void gao1(string &s){for(int i=0;i<4;i++)swap(s[i],s[i+4]);}void gao2(string &s){char t=s[3];for(int i=2;i>=0;i--)s[i+1]=s[i];s[0]=t;t=s[7];for(int i=6;i>=4;i--)s[i+1]=s[i];s[4]=t;}void gao3(string &s){char tp=s[1];s[1]=s[5];s[5]=s[6];s[6]=s[2];s[2]=tp;}void bfs(){memset(vi,0,sizeof(vi));queue<node>q;node ss,tt;ss.str=s;ss.step="";ss.va=hash(s);q.push(ss);vi[ss.va]=1;dp[ss.va]="";while(!q.empty()){ss=q.front();q.pop();string t=ss.str;int k;gao1(t);k=hash(t);if(!vi[k]){tt.str=t;vi[k]=1;tt.step=ss.step+'A';tt.va=k;dp[k]=tt.step;q.push(tt);}t=ss.str;gao2(t);k=hash(t);if(!vi[k]){tt.str=t;vi[k]=1;tt.step=ss.step+'B';tt.va=k;dp[k]=tt.step;q.push(tt);}t=ss.str;gao3(t);k=hash(t);if(!vi[k]){tt.str=t;vi[k]=1;tt.step=ss.step+'C';tt.va=k;dp[k]=tt.step;q.push(tt);}}}int main(){func[0]=1;for(int i=1;i<=9;i++)func[i]=func[i-1]*i;s="12345678";bfs();while(cin>>s>>t){swap(s[4],s[7]);swap(s[5],s[6]);swap(t[4],t[7]);swap(t[5],t[6]);for(int i=0;i<8;i++)pos[s[i]-'0']=i+1;for(int i=0;i<8;i++)t[i]=pos[t[i]-'0'];/*置换*/int k=hash(t);cout<<dp[k]<<endl;}return 0;}

原创粉丝点击