胡搞-强化版的light oj-1055-的思路-AI版的6重暴力For循环的BFS
新题目大意:
三个棋子按照先后顺序,可以随意方向合法地走到空位置上(而不是像原题light oj-1055中的一样三个棋子每次走的方向都一致),当三个棋子全部走进目标地点,就结束;求需要指挥的最少次数。
思路:
BFS
在每次进行指挥时,需要分别指挥三个棋子,每个棋子至多有五种走法(第五种为原地不动——因为前进时受阻没法动的时候),同时枚举三个棋子的当前位置进入队列中。由于每个棋子在走的时候会影响到后续的点的移动,故需要三重for循环来枚举每次三个点的移动先后顺序,然后依旧三重循环来枚举搞定三个点的移动方向,然后判断-标记-加入队列?结束。
#define 其余头文件...
#define N 10
#define inf 0x3f3f3f3f
char mp[N][N];
int n;
struct node{
int x,y;
}just;
struct group{//一个局面三个点的位置,位置之间等价
node p[];//0,1,2三位有效存储
int step;
}st;
int dir[][]={{,},{,},{,},{,-},{-,} };
bool vis[N][N][N][N][N][N];//标记数组,模拟每一组棋子组合成的局面
bool judge_end(group x){ //判断当前局面是否达到结束要求
int num=;
for(int i=;i<;i++){
if(mp[x.p[i].x][x.p[i].y]=='X')
num++;
}
if(num==)return true;
return false;
}
void getvis(group a){//从一个局面获取6个标记
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
vis[a.p[].x][a.p[].y][a.p[].x][a.p[].y][a.p[].x][a.p[].y]=true;
}
bool getstep(int i,int k,group a){//i表示第i个点的下一步操作,向dir[k]进行下一步
node s=a.p[i];
s.x=s.x+dir[k][];
s.y=s.y+dir[k][];
if(s.x>=n||s.y>=n||s.x<||s.y<)return false;//越界,‘#’,走到同一局面其他点上, false
if(mp[s.x][s.y]=='#')return false;
for(int j=;j<=;j++){
if(i!=j&&(a.p[j].x==s.x)&&(a.p[j].y==s.y))
return false;
}
just=s;//存储的全局变量
return true;
}
void debug(group a){
printf("*%dstep* *A*(%d,%d) ",a.step,a.p[].x,a.p[].y);
printf("*B*(%d,%d) ",a.p[].x,a.p[].y);
printf("*C*(%d,%d)\n",a.p[].x,a.p[].y);
}
int bfs(){
memset(vis,false,sizeof(vis));
group now,ne,ne2,ne3;
queue<group>Q;
st.step=;
Q.push(st); //标记起点局面
getvis(st);
while(Q.size()){
now=Q.front();
Q.pop();
if(judge_end(now))return now.step;
//按ABC,ACB,BAC,BCA,CAB,CBA六种先后方式来枚举,i-j-k三重循环
for(int i=;i<;i++){//枚举第一个先走的编号
for(int j=;j<;j++){//枚举第二个编号
for(int k=;k<;k++){//第三个
if(j==i||i==k||j==k)continue; for(int x=;x<;x++){ //x-y-z三种循环分别表示i-j-k的走位方向
ne=now;
if(getstep(i,x,ne)==false)continue;
else ne.p[i]=just;
for(int y=;y<;y++){
ne2=ne;
if(getstep(j,y,ne2)==false)continue;
else ne2.p[j]=just;
for(int z=;z<;z++){
ne3=ne2;
if(getstep(k,z,ne3)==false)continue;
else ne3.p[k]=just;
//在这里得到了合格的next3局面,然后进行判断
if(vis[ne3.p[].x][ne3.p[].y][ne3.p[].x][ne3.p[].y][ne3.p[].x][ne3.p[].y]==true)
continue;//重复走过了
ne3.step=now.step+;
// debug(ne3);
getvis(ne3);//进行标记
if(judge_end(ne3)){
// printf("--up|------now :");debug(now);
return ne3.step;
}
else
Q.push(ne3);
}
}
}
}
}
}
}
return -;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<n;i++)//读图
scanf("%s",mp[i]);
int num1=;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(mp[i][j]>='A'&&mp[i][j]<='C')
st.p[num1].x=i,st.p[num1++].y=j;
}
}
printf("Case %d: ",++cas);
int ans=bfs();
if(ans!=-)
printf("%d\n",ans);
else
printf("trapped\n");
} return ;
}
胡搞-强化版的light oj-1055-的思路-AI版的6重暴力For循环的BFS的更多相关文章
- 如何用python制作贪吃蛇以及AI版贪吃蛇
用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- Light OJ 1114 Easily Readable 字典树
题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- [LeetCode]Integer Break(Dp或胡搞或推公式)
343. Integer Break Given a positive integer n, break it into the sum of at least two positive intege ...
- light oj 1007 Mathematically Hard (欧拉函数)
题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- HDU 4690 EBCDIC (2013多校 1005题 胡搞题)
EBCDIC Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total Su ...
随机推荐
- 【计算机视觉】行为识别(action recognition)相关资料
================华丽分割线=================这部分来自知乎==================== 链接:http://www.zhihu.com/question/3 ...
- python实践项目二:列表转字符串
将列表各元素转换为字符串并以规定形式返回. 假定有下面这样的列表:spam = ['apples', 'bananas', 'tofu', 'cats'],将其转换成字符串:'apples, bana ...
- mysql数据表的编辑
创建数据表 create table [if not exists] 表名(字段列表, [约束或索引列表]) [表选项列表]; 删除数据表 drop table [if exists] ...
- 计算机视觉/图像处理工具箱推荐(转自cvnote)
最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...
- mysql数据库,数据表,数据的增删查改语句
查询mysql支持的引擎 show engines; 查询mysql支持的字符集 show character set; 设置mysql默认存储引擎 set default_storage_engin ...
- Python 实例代码二
1.实现isNum()函数,参数为一个字符串,如果这个字符串属于整数.浮点数或复数的表示,则返回True,否则返回False def isNum(word): try: word=type(eval( ...
- vue项目过程的理解: main.js文件理解 router.js文件理解 以及组件 路由 等之间的关系
https://blog.csdn.net/qq_26229005/article/details/85040393 内容太多了,有空再整理
- Spring Boot使用@ConfigurationProperties注解获取配置文件中的属性值
注意:这种方式要提供属性的getter/setter方法—— 如果idea报错,提示没有相应的执行器,就需要在maven中添加: (虽然不配置代码也能正常运行,作用在下面会说明) 配置了该执行器后,在 ...
- mouseenter 与 mouseover 区别于选择
mouseover事件, 箭头在子元素移动会触发冒泡事件, 子元素的鼠标箭头可触父元素方法, 相反,mouseenter事件功能与mouseover类似, 但鼠标进入某个元素不会冒泡触发父元素方法. ...
- vmware vSphere Data Protection 6.1--------2-初始化
一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...