题目链接:点我

第一次不太清楚怎么判重,现在懂了,等下次再做

 /*
*HDU 4531
*BFS
*注意判重
*/ #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <iostream>
using namespace std; char str[][][];
char g[][][]; map<int,int>mp;
queue<int>q;
bool move[];//是否可以移动,0~5对应1~3行,1~3列 //并查集判断连通
int F[];
int find(int x)
{
if(F[x]==-)return x;
return F[x]=find(F[x]);
}
void bing(int x,int y)
{
int t1=find(x);
int t2=find(y);
if(t1!=t2)F[t1]=t2;
}
//并查集判断是不是连通
bool judge(int state)//判断状态state是不是连通
{
char temp[];
int t[];
sprintf(temp,"%09d",state);
for(int i=;i<;i++)t[i]=temp[i]-'';
for(int i=;i<;i++)
for(int j=;j<;j++)
{
int p=t[*i+j];
int x=p/;
int y=p%;
strcpy(g[i][j],str[x][y]);
}
memset(F,-,sizeof(F));
for(int i=;i<;i++)
for(int j=;j<;j++)
{
if(g[i][j][]==g[i][j][])bing(*i+*j,*i+*j+);
if(g[i][j][]==g[i][j][])bing(*i+*j,*i+*j+);
if(g[i][j][]==g[i][j][])bing(*i+*j+,*i+*j+);
if(g[i][j][]==g[i][j][])bing(*i+*j+,*i+*j+);
}
for(int i=;i<;i++)
{
if(g[i][][]==g[i][][])bing(*i+,*i++);
if(g[i][][]==g[i][][])bing(*i++,*i++);
}
for(int j=;j<;j++)
{
if(g[][j][]==g[][j][])bing(*j+,+*j+);
if(g[][j][]==g[][j][])bing(+*j+,+*j+);
}
int R=-,G=-,B=-,O=-;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
{
int t1=find(*i+*j+k);
if(g[i][j][k]=='R')
{
if(R==-)R=t1;
else if(t1!=R)return false;
}
else if(g[i][j][k]=='G')
{
if(G==-)G=t1;
else if(t1!=G)return false;
}
else if(g[i][j][k]=='B')
{
if(B==-)B=t1;
else if(t1!=B)return false;
}
else
{
if(O==-)O=t1;
else if(t1!=O)return false;
}
}
return true;
}
int bfs()
{
mp.clear();
while(!q.empty())q.pop();
int tmp,now;
char ss1[],ss2[];
tmp=; //初始是012345678
mp[tmp]=;
q.push(tmp);
while(!q.empty())
{
tmp=q.front();
q.pop();
if(judge(tmp))return mp[tmp];
sprintf(ss1,"%09d",tmp); for(int i=;i<;i++)
for(int j=;j<;j++)
{
int t=ss1[*i+j]-'';
strcpy(g[i][j],str[t/][t%]);
}
//第一行的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} } //第二行的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
}
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
}
} //第三行的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} } //第一列的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} } //第二列的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} } //第三列的左右移动
if(move[])
{
strcpy(ss2,ss1);
ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
} ss2[]=ss1[];
ss2[]=ss1[];
ss2[]=ss1[];
now=;
for(int i=;i<;i++)
{
now*=;
now+=ss2[i]-'';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+;
q.push(now);
}
} }
return -;
} int main()
{
int T;
scanf("%d",&T);
int iCase=;
while(T--)
{
iCase++;
printf("Case #%d: ",iCase);
for(int i=;i<;i++)move[i]=true;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
scanf("%s",&str[i][j]);
if(str[i][j][]=='')//所在的列和行不能移动
{
move[i]=false;
move[+j]=false;
}
}
printf("%d\n",bfs());
}
return ;
}

hdu 4531 bfs(略难)的更多相关文章

  1. HDU 4531 bfs/康拓展开

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4531 吉哥系列故事——乾坤大挪移 Time Limit: 2000/1000 MS (Java/Othe ...

  2. hdu 5040 BFS 多维化处理图

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 跟这一题http://blog.csdn.net/u011026968/article/details/3 ...

  3. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  4. HDU 2822 (BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...

  5. HDU 1180 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...

  6. HDU 2531 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531 题目大意: 你的身体占据多个点.每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最 ...

  7. HDU 5025 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...

  8. HDU 1429 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...

  9. HDU 1026 (BFS搜索+优先队列+记录方案)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...

随机推荐

  1. java 面试算法题

    /** * 设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从 * 出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为 * 止.设n个人的编号分别为1,2,… ...

  2. Python图片验证码降噪 — 8邻域降噪

    简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需 ...

  3. [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率

    首先,介绍下关于InnoDB引擎存储格式的几个要点:1.InnoDB可以选择使用共享表空间或者是独立表空间方式,建议使用独立表空间,便于管理.维护.启用 innodb_file_per_table 选 ...

  4. python 中的__del__

    # -*- coding: utf-8 -*- # @Time : 2018/9/19 20:21 # @Author : cxa # @File : delDemo.py # @Software: ...

  5. 七、springboot整合Spring-data-jpa

    1.Spring Data JPA是什么 由Spring提供的一个用于简化JPA开发的框架.可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能 1 ...

  6. poj1063

    题意:有一些珠子排成一圈,珠子有两种颜色:黑和白.每次操作可以调换中间隔着一个珠子的两珠子的位置,给出这个圈子的初始状态,问最终能否通过操作让圈子中所有同色的珠子排在一起,即黑白分开. 分析:分两种情 ...

  7. 前端打包工具之fis3的初级使用

    说到打包工具,大家都会想到webpack,我之前也接触过webpack,说实话个人觉得webpack上手容易,但是对于新手来说里面有太多坑,配置文件也不简单.于是乎,我转入了fis3阵营,发现fis3 ...

  8. 用户说体验 | 关于阿里百川HotFix你需要了解的一些细节

    最近很火的热修复技术,无意中了解到阿里百川也在做,而且Android.iOS两端都支持,所以决定试一试.试用一段时间后,感觉还不错,主要是他们有一个团队在不断维护更新这个产品,可以看到他们的版本更新记 ...

  9. Java小实验之数据转换

    看到有人问如图的程序,就去写了几行代码,顺便复习一下条件语句和ASCII码 import java.util.Scanner; public class test1 { public static v ...

  10. SQL group 分组查询

    1.使用group by进行分组查询  在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:  被分组的列 为每个分组返回一个值得表达式,例如 ...