第一次不是以学为目的的做题,之前的题都是看了基本算法和模板代码以后去做的,所以这次非常有挑战性, 当然,这种难度还是轻松把我打败了
A是hdu3088 WORM ,一道hash判重+BFS,一开始不会hash判重,更别说三进制hash了,那天正好看了lrj的书,里面一道八数码跟这题差不多,于是就硬写了两个钟头,到头来才发现memcmp和strcmp的原理不一样,用法也不一样,如果两个数组的开头a[0],b[0]是一样的,那么memcmp就会判断它是一样的,因为八数码问题每个数都不相同,所以lrj才那么用,算是被他坑了。后来因为没有懂得把r,b,g换成数字,也着实麻烦了一阵。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//hash三进制判重+BFS //输入rgb字符串转化成字符的123 //自己写的再看别人的代码以后才ac #include<iostream> #include<cstring> #include<queue> #include<memory> using namespace std; const int maxst=100000;//字母的状态有3^10种排列 int t,len,h; bool vis[maxst];//hash表 int goal[3]; char str[11]; struct state{ char ch[11]; int step; };//队列节点 char change(char a,char b){ if(a+b == '0'+'1') return '2'; if(a+b == '0'+'2') return '1'; if(a+b == '1'+'2') return '0'; } int Hash(char* a) { int s=0,x; for(int i=0;i<len;i++) s=s*3+a[i]-'0'; return s; } int bfs(){ state st[maxst]; queue<state>q; int step; state u; memset(vis,0,sizeof(vis)); h=Hash(str);//习惯性的要先处理第一组数据 if(h==goal[0]||h==goal[1]||h==goal[2]) return 0; strcpy(u.ch,str); u.step=0; q.push(u); vis[h]=1; while(!q.empty()){ u=q.front(); u.step++; q.pop(); h=Hash(u.ch); for(int i=0;i<len-1;i++) { if(u.ch[i]==u.ch[i+1]) continue; char x=u.ch[i],y=u.ch[i+1];//先保存下来 u.ch[i]=u.ch[i+1]=change(x,y); h=Hash(u.ch); if(h==goal[0]||h==goal[1]||h==goal[2]) return u.step; if(!vis[h]) { vis[h]=1; q.push(u); } u.ch[i]=x;u.ch[i+1]=y;//还原 } } return -1; } int main (){ char last[12]; cin>>t; while(t--) { cin>>str; getchar(); len=strlen(str); for(int i=0;i<len;i++) { if(str[i]=='r') str[i]='0'; else if(str[i]=='b') str[i]='1'; else if(str[i]=='g') str[i]='2'; } str[len]='