Fork me on GitHub

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点钟那个维族女生好好看,又他妈不能专注了艹
View Code

 

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 }
View Code

 

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题目里说

posted @ 2024-10-02 17:51  GerJCS  阅读(16)  评论(0)    收藏  举报