hdu 1430+hdu 3567(预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430
思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状态标号做相应的修改,先预处理出12345678到所有状态的路径,记录所有状态的pre值,直接输出即可。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<string>
- using namespace std;
- struct Node{
- char str[];
- Node(){};
- Node(char _str[]){
- for(int i=;i<;i++){
- str[i]=_str[i];
- }
- }
- };
- int fac[]={,,,,,,,,};
- int Get_Hash(Node &p)
- {
- int val=;
- for(int i=;i<;i++){
- int cnt=;
- for(int j=;j<i;j++){
- if(p.str[j]>p.str[i])cnt++;
- }
- val+=cnt*fac[i];
- }
- return val;
- }
- void Move_A(Node &p)
- {
- reverse(p.str,p.str+);
- }
- void Move_B(Node &p)
- {
- char ch=p.str[];
- for(int i=;i>=;i--)p.str[i]=p.str[i-];
- p.str[]=ch;
- ch=p.str[];
- for(int i=;i<=;i++)p.str[i]=p.str[i+];
- p.str[]=ch;
- }
- void Move_C(Node &p)
- {
- swap(p.str[],p.str[]);
- swap(p.str[],p.str[]);
- swap(p.str[],p.str[]);
- }
- int pre[],ans[];
- bool mark[];
- void BFS()
- {
- queue<Node>que;
- que.push(Node(""));
- memset(mark,false,sizeof(mark));
- mark[]=true;
- while(!que.empty()){
- Node p=que.front();
- que.pop();
- int p_val=Get_Hash(p);
- Node q(p);
- Move_A(q);
- int q_val=Get_Hash(q);
- if(!mark[q_val]){
- mark[q_val]=true;
- pre[q_val]=p_val;
- ans[q_val]='A';
- que.push(q);
- }
- q=p;
- Move_B(q);
- q_val=Get_Hash(q);
- if(!mark[q_val]){
- mark[q_val]=true;
- pre[q_val]=p_val;
- ans[q_val]='B';
- que.push(q);
- }
- q=p;
- Move_C(q);
- q_val=Get_Hash(q);
- if(!mark[q_val]){
- mark[q_val]=true;
- pre[q_val]=p_val;
- ans[q_val]='C';
- que.push(q);
- }
- }
- }
- char S[],T[];
- int SS[];
- int main()
- {
- BFS();
- while(~scanf("%s%s",S,T)){
- for(int i=;i<;i++)SS[S[i]-'']=i;
- for(int i=;i<;i++)T[i]=SS[T[i]-'']+'';
- Node p=Node(T);
- int val=Get_Hash(p);
- string ss="";
- while(val){
- ss+=ans[val];
- val=pre[val];
- }
- reverse(ss.begin(),ss.end());
- cout<<ss<<endl;
- }
- return ;
- }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567
思路:因为这题有一个特殊的点X,所以枚举X的位置,打出9张前驱表,用魔板题一样的方法将两个状态的对应标号转化,输出就好了。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<queue>
- using namespace std;
- struct Node{
- int map[][];
- int x,y;
- Node(){}
- Node(char *str){
- for(int i=,xx=,yy=;str[i];i++){
- map[xx][yy]=str[i];
- if(str[i]=='X'){ x=xx,y=yy; }
- yy++;
- if(yy==)xx++,yy=;
- }
- }
- }S;
- int fac[]= {,,,,,,,,};
- //康拓展开
- int Get_Hash(Node &p)
- {
- char str[];
- int val=;
- for(int i=;i<;i++){
- for(int j=;j<;j++){
- str[i*+j]=p.map[i][j];
- int cnt=;
- for(int k=i*+j-;k>=;k--){
- if(str[k]>str[i*+j])cnt++;
- }
- val+=fac[i*+j]*cnt;
- }
- }
- return val;
- }
- int dir[][]={{,},{,-},{,},{-,}};
- char Dir[]="dlru";
- int pre[][];
- char ans[][];
- bool mark[];
- void bfs(int x)
- {
- memset(pre[x],-,sizeof(pre[x]));
- memset(mark,false,sizeof(mark));
- queue<Node>que;
- que.push(S);
- mark[Get_Hash(S)]=true;
- while(!que.empty()){
- Node p=que.front();
- que.pop();
- int p_val=Get_Hash(p);
- for(int i=;i<;i++){
- Node q=p;
- q.x=p.x+dir[i][],q.y=p.y+dir[i][];
- if(q.x<||q.x>=||q.y<||q.y>=)continue;
- q.map[p.x][p.y]=q.map[q.x][q.y];
- q.map[q.x][q.y]='X';
- int q_val=Get_Hash(q);
- if(mark[q_val])continue;
- mark[q_val]=true;
- pre[x][q_val]=p_val;
- ans[x][q_val]=Dir[i];
- que.push(q);
- }
- }
- }
- char str[];
- int num[];
- int main()
- {
- S=Node("X12345678");
- bfs();
- S=Node("1X2345678");
- bfs();
- S=Node("12X345678");
- bfs();
- S=Node("123X45678");
- bfs();
- S=Node("1234X5678");
- bfs();
- S=Node("12345X678");
- bfs();
- S=Node("123456X78");
- bfs();
- S=Node("1234567X8");
- bfs();
- S=Node("12345678X");
- bfs();
- int _case,p,t=;
- scanf("%d",&_case);
- while(_case --){
- scanf("%s", str);
- for(int i = , j = ; i <= ; i ++ ){
- if(str[i] != 'X') num[str[i] - ''] = j ++;
- else p = i;
- }
- scanf("%s", str);
- for(int i=;i<=;i++){
- if(str[i]=='X')continue;
- str[i]=num[str[i]-'']+'';
- }
- S=Node(str);
- int val=Get_Hash(S);
- string ss="";
- while(val!=-){
- ss+=ans[p][val];
- val=pre[p][val];
- }
- reverse(ss.begin(), ss.end());
- printf("Case %d: %d\n",t++,ss.size()-);
- for(int i=;i<ss.size();i++)cout<<ss[i];
- cout<<endl;
- }
- return ;
- }
hdu 1430+hdu 3567(预处理)的更多相关文章
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...
- hdu 1430 魔板 (BFS+预处理)
Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
- hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...
随机推荐
- 【原创】express3.4.8源码解析之路由中间件
前言 注意:旧文章转成markdown格式. 跟大家聊一个中间件,叫做路由中间件,它并非是connect中内置的中间件,而是在express中集成进去的. 显而易见,该中间件的用途就是 ------ ...
- sql重复记录查询
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId fro ...
- js实现把网页table导成Excel
//导出excel function exportExcel(DivID,strTitle){ if(DivID==null) { return false; } var jXls, myWorkbo ...
- php substr中文乱码最有效到解决办法 转:http://blog.sina.com.cn/s/blog_49b531af0100esah.html
(2009-07-29 12:29:38) 转载▼ 标签: php substr文乱码 网站开发 it 直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一 ...
- Stanford机器学习---第八讲. 支持向量机SVM
原文: http://blog.csdn.net/abcjennifer/article/details/7849812 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回 ...
- Procrustes Analysis普氏分析法
选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...
- win8.1禁用和去除SkyDrive任务栏图标方法
Win+R打开运行,输入gpedit.msc确定,打开本地组策略编辑器. 依次定位到:计算机配置-管理模板-Windows组件-OneDrive,双击阻止使用 OneDrive 执行文件储存.
- 自编译ngrok服务器
转载:http://www.haiyun.me/archives/1012.html 首先安装GO环境,http://www.haiyun.me/archives/1009.html 1 2 3 4 ...
- 试试markdown
看看有没有wrapper... list first list second list third list fourth list in list 1 list list list > < ...
- 《ASP.NET1200例》各种类型文件汇总
aspx是页面文件 ascx是用户控件,用户控件必须嵌入到aspx中才能使用. ascx是用户控件,相当于模板 其实ascx你可以理解为Html里的一部分代码, 只是嵌到aspx里而已, 因为aspx ...