POJ3087-Shuffle'm Up
继续跟着邝斌飞刷搜索
POJ3087,POJ官网总tm进不去了
搜其他平台的时候无意间看到个好玩的,目前没用,留着
hdoj16级暑假训练一
题目重点:麻痹的叫读题大赛得了,非常水的题
1、给出的S1\S2数据都是从S1/S2底部开始给的。(给你第一个样例AHAH,其实是从上到下竖着的一摞码片牌其实是HAHA)
2、洗牌的时候,将S12取出底部作为新S1,顶部作为新S2
3、最后的答案也是底部给出的。(一开始我看第二个样例是-1,觉得不对,其实从上到下是EEDDCC,但老逼登是从底部给出的,也就是洗一次牌得到的这个EEDDCC,用题目要求得到的书写格式是:CCDDEE)
一开始我还傻乎乎的写了个翻转数组的操作,根本没必要,由于都是从底部给出,所以忽略这个现实洗牌情景,可以直接简化题意:
给你仨数组,S1和S2和S12(大小分别为C和C和2C),按照:S2的第一个值,接着S1第一个值,接着S2第二个值,接着S1第一个值...最后是S1最后一个值,新得到的一个数组,取前面C个元素作为新的S1(也就是前面一半元素),后一半作为新的S2,问几次后得到S12,不行就输出-1
PS:题目的百度翻译很有误导性,还是原汁原味的英文题叙述更准,百度翻译让我误以为S2底部给S12底,S1底部给S12顶,接着S2、S1、S2、S1
AC代码

1 #include<stdio.h> 2 #include<string.h> 3 #include <vector> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 int C; 8 int T;//多少组数据 9 string S1; 10 string S2; 11 string S12; 12 string vis[200];//姑且当作100个最多会出现200个洗牌,因为C是2,洗2次变回去.C是3洗4次变回去.AC后发现100也可以过 13 struct Node{ 14 int step; 15 string realtime_map;//牌洗成结果为realtime_map 16 }; 17 Node firstNode; 18 queue<Node>q; 19 string KaKaXiPai(string S1,string S2);//咔咔洗牌函数 20 int flag; 21 int main() 22 { 23 // freopen("zhishu.txt","r",stdin); 24 cin>>T;//最多1000组 25 int t=T;//没啥用,就是打个补丁用来按照题目要求输出组数1 2 3的 26 while(T--){ 27 flag=0; 28 cin>>C; 29 cin>>S1; 30 cin>>S2; 31 cin>>S12;//至此输入数据完成 32 33 firstNode.realtime_map=KaKaXiPai(S1,S2); 34 firstNode.step=1; 35 vis[firstNode.step]=firstNode.realtime_map;//vis[1]代表(第一次洗牌一次后的)状态.后面如果再出现这个状态就别压入队列了 36 q.push(firstNode); 37 //cout<<firstNode.realtime_map<<"#"<<endl; 38 while(!q.empty()) 39 { 40 Node thisnode; 41 Node nextnode; 42 thisnode=q.front(); 43 q.pop(); 44 45 if(thisnode.realtime_map==S12){ 46 flag=1; 47 while(!q.empty()) 48 q.pop(); 49 cout<<t-T<<" "<<thisnode.step<<endl; 50 break; 51 } 52 string now_S1; 53 string now_S2; 54 for(int i=0;i<C;i++) 55 now_S1=now_S1+thisnode.realtime_map[i]; 56 for(int i=C;i<2*C;i++) 57 now_S2=now_S2+thisnode.realtime_map[i]; 58 59 nextnode.realtime_map=KaKaXiPai(now_S1,now_S2); 60 nextnode.step=thisnode.step+1; 61 vis[nextnode.step]=nextnode.realtime_map; 62 int f=0; 63 for(int i=1;i<nextnode.step;i++){ 64 if(vis[i]==vis[nextnode.step]) 65 { 66 f=1; 67 break; 68 } 69 } 70 if(f==0) 71 q.push(nextnode); 72 73 } 74 if(flag==0) 75 cout<<t-T<<" "<<-1<<endl; 76 } 77 } 78 string KaKaXiPai(string S1,string S2) 79 { 80 string ppp; 81 ppp=S2;//先把S1赋过去,然后逐步插入S2 82 83 for(int i=1,j=0; i<2*C,j<C; i+=2,j++){//成功洗牌一次 84 char c=S1[j]; 85 string str_c; 86 str_c.append(1,c); 87 ppp.insert(i,str_c); 88 } 89 return ppp; 90 }
1 死轴真有回报,那个题傻逼错误写法坚持去写,经历之后,这个题就如同砍瓜切菜 2 AA:不死总会出头 3 AA:不撞南墙不回头的死轴 4 景若芸:今天有男朋友了么没有,抑郁症 5 怎么都无法专注总想操逼,脑子里垃圾太多了 6 如果又有逼又有JB既赚钱还能自娱自乐 7 岛;好想找人操我,但又找不到人 8 q神,岛娘空间都拉黑他们 9 10点钟那个维族女生好好看,又他妈不能专注了艹
AC后发现代码写的太朴素了, 想学点高科技,就去学了下map,我搜了好几个,我他妈直接看到云里雾里。
写了好久的练习代码总算懂点了
1 #include <iostream> 2 #include <string.h> 3 #include <map> 4 using namespace std; 5 map<string,int>str; 6 int main() 7 { 8 char s[5]; 9 // s="sdku"; 10 strcpy(s, "sdku"); 11 str[s]++; 12 str[s]=3; 13 cout<<str[s]<<endl; 14 cout<<str.count(s)<<endl; 15 16 // map<string, string>mapRole; 17 //// mapRole.insert(pair<string, string>("warlock", "Horde")); 18 // mapRole["warlock"]="Horde"; 19 // 20 // cout << "mapRole[\"warlock\"] is: " << mapRole["warlock"] << endl; 21 }
BFS+map写法的AC代码
1 #include<stdio.h> 2 #include<string.h> 3 #include <vector> 4 #include<iostream> 5 #include<queue> 6 #include<map> 7 using namespace std; 8 int C; 9 int T;//多少组数据 10 string S1; 11 string S2; 12 string S12; 13 14 struct Node{ 15 int step; 16 string realtime_map;//牌洗成结果为realtime_map 17 }; 18 Node firstNode; 19 queue<Node>q; 20 map<string,int>themap; 21 string KaKaXiPai(string S1,string S2);//咔咔洗牌函数 22 int flag; 23 int main() 24 { 25 // freopen("zhishu.txt","r",stdin); 26 cin>>T;//最多1000组 27 int t=T;//没啥用,就是打个补丁用来按照题目要求输出组数1 2 3的 28 while(T--){ 29 flag=0; 30 cin>>C; 31 cin>>S1; 32 cin>>S2; 33 cin>>S12;//至此输入数据完成 34 35 firstNode.realtime_map=KaKaXiPai(S1,S2); 36 firstNode.step=1; 37 themap[firstNode.realtime_map]++; 38 q.push(firstNode); 39 40 while(!q.empty()) 41 { 42 Node thisnode; 43 Node nextnode; 44 thisnode=q.front(); 45 q.pop(); 46 47 if(thisnode.realtime_map==S12){ 48 flag=1; 49 while(!q.empty()) 50 q.pop(); 51 cout<<t-T<<" "<<thisnode.step<<endl; 52 break; 53 } 54 string now_S1; 55 string now_S2; 56 for(int i=0;i<C;i++) 57 now_S1=now_S1+thisnode.realtime_map[i]; 58 for(int i=C;i<2*C;i++) 59 now_S2=now_S2+thisnode.realtime_map[i]; 60 61 nextnode.realtime_map=KaKaXiPai(now_S1,now_S2); 62 nextnode.step=thisnode.step+1; 63 if(themap.count(nextnode.realtime_map)==0) 64 { 65 themap[nextnode.realtime_map]++; 66 q.push(nextnode); 67 } 68 69 } 70 if(flag==0) 71 cout<<t-T<<" "<<-1<<endl; 72 } 73 } 74 string KaKaXiPai(string S1,string S2) 75 { 76 string ppp; 77 ppp=S2;//先把S1赋过去,然后逐步插入S2 78 79 for(int i=1,j=0; i<2*C,j<C; i+=2,j++){//成功洗牌一次 80 char c=S1[j]; 81 string str_c; 82 str_c.append(1,c); 83 ppp.insert(i,str_c); 84 } 85 return ppp; 86 }
其实这题没必要用BFS,因为没有其他选择,就是咔咔一顿洗牌,洗完了是就输出,不是就继续洗tmd
结构体用的也多余,没必要用realtime_map
###:string的插入
###:string转char
###:学习map过程中遇到的好博客:参考博客、参考博客、AC代码参考博客(map)写法(发现第一个不严谨的东西,map不严格区分string和char[],可以把字符串当作string?先不研究暂时搁置)
###:重温了下其他人写的char字符串,也是我最烦的,strcmp比较函数,相等返回0,char字符串只能在定义的时候赋值,定义完再赋值会报错,只能用strcpy
###:那这样上一个博客,错误思维的(M*N)^(M*N)复杂度的代码,看某容器中有无某元素的代码可以用map了 (就怕map用傻了,这两个题写了个朴素代码来代替map也算满足了强迫症的我,以后可以大胆用map了)
###:惊天大坑,我在刷Fire Game这个题的时候,遇到的,for里面的条件如果有多个,必须用'&&',或者是'||',这个题因为比如5个数,i像那样是1 3 5 7 9五个数,j是0 1 2 3 4 5也是五个数,正好可以,所以把错误给掩盖了,具体Fire Game题目里说


浙公网安备 33010602011771号