描述

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. day38-常见第三方模块

    1.requests模块 2.psutil模块 3.xlrd模块 4.xlwt模块 5.Paramiko模块

  2. WDA-Webdynpro应用发布至EP

    主要是记录下Webdynpro应用发布到EP端的整个操作过程. 1.系统管理System Administration 定义与后台应用系统R3的连接 1.1设置连接参数 路径:System Admin ...

  3. List去重问题引出来的hashCode和equals方法

    一.List 里面是基本类型的去重问题 import java.util.ArrayList; import java.util.HashSet; import java.util.List; imp ...

  4. 页面ajax自带的访问后台时,正在加载中

    ajax自带访问后台时,提示正在加载中,加载完成后自动消除遮罩层,代码如下: var mask=mui.createMask();//遮罩层 //传统ajax的post请求方式 mui.ajax('h ...

  5. Oracle 学习总结 - 物理结构

    参考了很多文章,学习自网络 数据库 = 实例(数据库启动时初始的进程和内存结构,进程会作用到对应的内存区域-数据写入器到写入内存缓冲区,日志写入器到日志缓冲区等) + 数据库(物理文件-控制文件,数据 ...

  6. 八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include<stdio.h> #include<math.h> #define SIZE 8 void Circumsribe( ...

  7. css实现角标

    效果图: 简单方式可以使用背景图片,但这里我使用的css来实现,最笨的方式是使用矩形div然后旋转遮挡就可以, <div class='checked-item'>    角标实现 < ...

  8. maven ,添加加密算法,使用

    1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹.MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同. MD5(Me ...

  9. TLS协议工作过程;如何应用TLS/SSL协议为WEB流量提供安全

      SSL/TLS协议的基本过程是这样的: 客户端向服务器端索要并验证公钥. 双方协商生成"对话密钥". 双方采用"对话密钥"进行加密通信.   上面过程的前两 ...

  10. Android EventBus3.x 使用详解

    ♪(^∇^*) 五一假期在家无事,新项目中用的是RxJava2+EventBus感觉还不错,趁这闲暇总结下EventBus. 一.概要简述 EventBus是一个基于观察者模式的Android事件发布 ...