描述

You are playing one game called "Number Maze". The map of an example is shown in the following figure.

In the map, there are N*N+2 cells. When the game starts, you stay the top-left cell and you target is to reach the bottom-right cell with fewest number of moves. At the first step, you must move to the right of the start cell. After that, you can move to any cell (left, right, up or down, but can not move diagonally) if the target cell can be divided by the sum of the previous two numbers. However, you should never move backwards. For example, at first, you stay at the "2" cell, and you must move to the "6" cell, then have two selections "8" or "4" because (2+6)/8=1 and (2+6)/4=2, you can not move back to the "2" cell at this step although (2+6)/2=4. One possilbe solution is 2->6->8->7->5->3->4->7->11->2->13, and the total number of moves is 10.
Another solution is also legal but has longer moves:2->6->8->7->5->3->4->7->5->3->4->7->11->2->13

输入

Thare are at most 20 cases. The first line of each case has three
integers N<=10, S and T, which N indicates the dimension of the map, S
and T indicate the number in the start and target cell. Then follows N
lines and each line has N positive integers which indicate each number
in the N*N cells.
There has one blank line after each case and you can assume that the total number of all cells is no larger than 1000000.

The inputs are ended with End of File. If you have some questions, please visit the help page.

输出

Each case outputs the fewest number of moves or "Impossible" if you can not reach the target cell per line.

样例输入

3 2 13
6 4 3
8 7 5
2 11 2

样例输出

10

题意

由图可得,从图中S点出发到E点,第一步一定走到右边一格,第二步满足前两步和可以被当前值整除,不可以往回走

题解

首先我们得考虑怎么记录前驱,可以在结构体里新加pre,prex,prey,每次走的时候更新

然后我们还得考虑死循环的问题

例如

2 2 2

2 2

2 2

我们可以把每个点设一个设定值,如果一个点走的次数超过设定值,标记为不可走

写完一交,wa了??原因不明,后来发现没有考虑往回走的问题(t.prex!=h.x||t.prey!=h.y)

代码

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int N=;
int n,G[N][N],in[N][N],vis[N][N];
int dx[]={,,,-};
int dy[]={,-,,};
struct p
{
int x,y,step,pre,prex,prey;
}t,h;
int bfs(int s)
{
memset(in,,sizeof(in));
memset(vis,,sizeof(vis));
queue<p>q;
t.x=,t.y=,t.step=,t.pre=s,t.prex=,t.prey=;
q.push(t);
while(!q.empty())
{
t=q.front();q.pop();
if(++in[t.x][t.y]>=)vis[t.x][t.y]=;//一个点入队次数>设定值就标记为不可走
if(t.x==n&&t.y==n+)return t.step;
for(int i=;i<;i++)
{
h.x=t.x+dx[i],h.y=t.y+dy[i];
h.step=t.step+;
h.pre=G[t.x][t.y];//前驱
h.prex=t.x,h.prey=t.y;//前驱的x和y
int sum=h.pre+G[t.prex][t.prey];
if(!vis[h.x][h.y]&&h.x>=&&h.x<=n&&h.y>=&&h.y<=n+&&(t.prex!=h.x||t.prey!=h.y)&&G[h.x][h.y]&&sum%G[h.x][h.y]==)
q.push(h);
}
}
return -;
}
int main()
{
int s,e;
while(scanf("%d%d%d",&n,&s,&e)!=EOF)
{
memset(G,,sizeof(G));
G[][]=s;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
scanf("%d",&G[i][j]);
G[i][n+]=;
}
G[n][n+]=e;
int k=bfs(s);
if(k==-)printf("Impossible\n");
else printf("%d\n",k);
}
return ;
}

TZOJ 3709:Number Maze(广搜记录前驱)的更多相关文章

  1. 台州OJ 3709: Number Maze (数组越界不报RE,报WA坑爹)

    http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3709 You are playing on ...

  2. TZOJ 5279 马拉松比赛(广搜)

    描述 有一块矩形的海域,其中有陆地也有海洋,这块海域是CSUFT_ACM集训队的训练基地,这一天,昌神说要集训队的队员不能总是训练,于是昌神提出了中南林ACM集训队第一场环陆马拉松比赛,顾名思义就是围 ...

  3. TZOJ 3533 黑白图像(广搜)

    描述 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如图所示的图形有3个八连块. 输入 第1行输入一个正 ...

  4. POJ 3026 Borg Maze 广搜(BFS)+最小生成树

    题意:从S出发,去抓每一个A,求总路径最短长度.在S点和A点人可以分身成2人,不过一次只能让一个人走. 思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板. 一次性A了.不过觉得在判断 ...

  5. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

  6. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  7. UVA 10047 The Monocycle (状态记录广搜)

    Problem A: The Monocycle  A monocycle is a cycle that runs on one wheel and the one we will be consi ...

  8. POJ 3984 迷宫问题 记录路径的广搜

    主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...

  9. TZOJ 2755 国际象棋(广搜+哈希)

    描述 在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走 ...

随机推荐

  1. Activity工作流学习(二)--Activity数据库

    23张表 ACT_RE_资源库流程规划表 act_re_deployment 部署信息表 act_re_model 流程设计模型部署表 act_re_procdef 流程定义数据表 ACT_RU_运行 ...

  2. day23-类的封装

    1.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容.所以,在使用面向对象的封装特性时,需要:1)将内容封装到某处2)从某处调用被封装的内容 第一步:将内容封装到某处 cl ...

  3. day06-三元表达式

    python中没有其他语言中的三元表达式,不过有类似的实现方法 其他语言中,例如java的三元表达式是这样int a = 1;String b = "";b = a > 1? ...

  4. js模板引擎初级

    模板引擎:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档. 模板引擎的实现方式有 ...

  5. 尚硅谷springboot学习13-配置的加载

    配置可以有很多不同的来源,也有不同的加载顺序,下面来具体的看一下 配置文件加载位置 spring boot 启动会扫描以下位置的application.properties或者application. ...

  6. ReactiveX 学习笔记(17)使用 RxSwift + Alamofire 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  7. 关于openwrt使用web升级提示固件版本不对的处理方法

    参考资料:https://blog.csdn.net/caoshunxin01/article/details/79355602 当openwrt使用web升级提示固件版本不对: The upload ...

  8. mac使用brew安装sshpass

    brew安装sshpass brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Form ...

  9. SQLServer中利用NTILE函数对数据进行分组的一点使用

    本文出处:http://www.cnblogs.com/wy123/p/6908377.html NTILE函数可以按照指定的排序规则,对数据按照指定的组数(M个对象,按照某种排序分N个组)进行分组, ...

  10. 创建DLL动态链接库——声明导出法

    DLL声明导出法:是通过使用__declspec(dllexport),添加到需要导出的函数前,进行声明. 头文件定义如下(OPdll.h): 源文件定义如下(OPdll.cpp): 通过以上两个文件 ...