题意:蛇形填数,然后素数处是障碍,给你起点终点,求步数;

思路:其实就是bfs,关键是将数字转换成位置比较难;

bfs其实比较简单,就是固定的思路,固定的步骤;

模板:

 const int dir[][] = {{-, }, {, }, {, }, {, -}};
int vis[maxn], d[maxn];
bool is_ok(int x, int y)///坐标是否合格,按照题意来进行
{
if(x< || y<||x>n||y>n)
return false;
return true;
}
int dfs(Node st,Node ed)///起点终点
{
queue<Node> q;
q.push(st);///压进起点
memset(vis,,sisteof(vis));
memset(d,,sizeof(d));
int ss = a[st.x][st.y];
d[ss] = ;
int edd = a[ed.x][ed.y];
while(!q.empty())
{
Node c = q.front(),v;
q.pop();
int stt = a[c.x][c.y];
if(stt == edd)///先判断是否到达终点
return d[stt];
repu(i,,)
{
v.x = c.x + dir[i][];
v.y = c.y + dir[i][];
if(is_ok(v.x,v.y))///坐标是否合格
{
int sd = a[v.x][v.y];
if(!vis[sd])///符合所有条件后
{
q.push(v);///压进
vis[sd] = ;///V过
d[sd] = d[stt] + ;///步数为之前的+1
}
}
else
continue;
}
}
return -;
}

该题代码

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <algorithm>
#include<queue>
#include <set>
#define repu(i,a,b) for(int i=a;i<b;i++)
using namespace std;
#define N 1000010
#define ll long long
#define _cle(m, a) memset(m, a, sizeof(m))
const int maxn = ;
const int mn = ;
int tot;
int a[][];
struct Node
{
int x, y;
} nodes[maxn];
void init()
{
memset(a, , sizeof(a));
a[mn][mn] = ;
tot = ;
nodes[].x = mn;
nodes[].y = mn;
int cur = ;
int i = mn, j = mn+;
while(tot <= maxn)
{
int t;
t = ;
i++;
while(t < cur*)
{
a[--i][j] = ++tot;
nodes[tot].x = i;
nodes[tot].y = j;
t++;
}
t = ;
while(t < cur*)
{
a[i][--j] = ++tot;
nodes[tot].x = i;
nodes[tot].y = j;
t++;
}
t = ;
while(t < cur*)
{
a[++i][j] = ++tot;
nodes[tot].x = i;
nodes[tot].y = j;
t++;
}
t = ;
while(t < cur*)
{
a[i][++j] = ++tot;
nodes[tot].x = i;
nodes[tot].y = j;
t++;
}
++j;
cur++;
}
}
int prime[maxn];
void is_prime()
{
memset(prime, , sizeof(prime));
int m = sqrt(maxn+0.5);
prime[] = prime[] = ;
for(int i = ; i <= m; i++)
{
if(!prime[i])
{
for(int j = i*i; j <= maxn; j+=i)
{
prime[j] = ;
}
}
}
} const int dir[][] = {{-, }, {, }, {, }, {, -}};
int vis[maxn], d[maxn];
bool is_ok(int x, int y)
{
return x>= && y >=;
}
int bfs(Node z,Node b)
{
queue<Node> q;
q.push(z);
memset(vis,,sizeof(vis));
memset(d,,sizeof(d));
int ss = a[z.x][z.y];
d[ss] = ;
int ed = a[b.x][b.y];
while(!q.empty())
{
Node c = q.front(),v;
q.pop();
int st = a[c.x][c.y];
if(st == ed)
return d[st];
repu(i,,)
{
v.x = c.x + dir[i][];
v.y = c.y + dir[i][];
if(is_ok(v.x,v.y))
{
int sd = a[v.x][v.y];
if(!vis[sd]&&prime[sd])
{
q.push(v);
vis[sd] = ;
d[sd] = d[st] + ;
}
}
else
continue;
}
}
return -;
}
int main()
{
init();
is_prime();
int x, y, kase = ;
while(~scanf("%d%d", &x, &y))
{
if(!prime[x] || !prime[y])
{
printf("Case %d: impossible\n", ++kase);
continue;
}
int ans = bfs(nodes[x], nodes[y]);
if(ans == -) printf("Case %d: impossible\n", ++kase);
else printf("Case %d: %d\n", ++kase, ans);
} return ;
}

HDU-4255 BFS 最短路的更多相关文章

  1. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  2. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  4. 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路

    题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...

  5. 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流

    题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...

  6. BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)

    BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...

  7. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  8. BFS(最短路) HDU 2612 Find a way

    题目传送门 /* BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 */ /***************************************** ...

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

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

  10. HDU 1548 A strange lift (bfs / 最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Time Limit: 2000/1000 MS (Java/Ot ...

随机推荐

  1. JavaWeb基础: Web应用和Web服务器

    Web Server工作原理 假设工程师想提供一个网页浏览的Web应用给客户,需要经过以下几步: 在指定目录下新建资源(hello.html) 编写一个服务器ServerDemo监听请求和响应请求:S ...

  2. hdu 4081 Qin Shi Huang's National Road System (次小生成树)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  3. JS基础--问题记录

    1. {}var a={};{}是一个空的对象,是 new Object();的简写. 2.判断元素是存在 //jQuery 对象中元素的个数.当前匹配的元素个数. size 将返回相同的值. if ...

  4. POC测试——原型验证,降低风险,IT系统销售工作之一

    POC测试,即Proof of Concept,是业界流行的针对客户具体应用的验证性测试,根据用户对采用系统提出的性能要求和扩展需求的指标,在选用服务器上进行真实数据的运行,对承载用户数据量和运行时间 ...

  5. 什么是 Unix 以及它为什么这么重要?

    大多数操作系统可以被划分到两个不同的家族.除了微软的基于Windows NT的操作系统外,几乎所有其他的都可以追溯到Unix. Linux,Mac OS X,Android,iOS,Chrome OS ...

  6. PDF 补丁丁 0.4.1.804 测试版发布:合并文件夹的图片和PDF文件,自由生成多层次书签

    新的测试版增强了合并文件的功能,可以合并文件夹内的图片和PDF文件,还可以在合并文件列表上直接指定与合并文件对应的PDF书签标题.通过拖放文件项目生成多层次的PDF书签.如下图所示: 另外,新的测试版 ...

  7. 为什么要使用 F#?

      对于小部分 .NET 程序员来说,学习一门 .NET Framework 函数化语言无疑将使自己在编写功能强大软件方面前进一大步.而对其他程序员来说,学习 F# 的理由就因人而异了.F# 能为开发 ...

  8. CentOS Hadoop格式化HDFS异常java.net.UnknownHostException

    #bin/hadoop namenode -format DEPRECATED: Use of this script to execute hdfs command is deprecated. I ...

  9. 微软WTL模板库完整版安装(VS2010+windows7X64位环境下)分享

    一:简介 想必大家对于微软的MFC应该都比较熟悉.但是WTL可能很多人比较陌生吧.下面我就简单的说说这个库. 首先对这个库的做个简单的介绍吧. WTL 是 Windows Template Libra ...

  10. WDCP管理面板安装启动EXIF、bcmath完整步骤

    一般我们网站建设的需要,如果使用WDCP面板默认的功能就足够使用,如果需要特殊程序的特定组件支持,就需要独立的安装支持组件.比如一位朋友的程序需要支持EXIF.bcmath组件,这不老蒋寻找解决方法, ...