小米 oj 马走日 (bfs 或 双向bfs)
马走日
序号:#56难度:困难时间限制:1500ms内存限制:10M
描述
在中国象棋中,马只能走日字型。现在给出一个由 N*M 个格子组成的中国象棋棋盘( 有(N+1)*(M+1)个交叉点可以落子 ),以及棋盘上的两个坐标点 S,T。请计算出从 S 到 T 使用日字型走法所需的最少步数,如果不能到达,则输出-1。
下图为一个 1x2 的棋盘,起始落子点(蓝色)为 (0, 0),目标落子点(绿色)为 (1,2) 的示意,此时需要的步数为 1:
输入
每行输入6个数,由;分隔,第一个数N,第二个数是M,接下来两个数是 S 点的 x,y 坐标,接着是 T 点的 x,y 坐标。输入保证满足 (1<=N<=1000, 1<=M<=1000, 0<=x<=N, 0<=y<=M)
输出
所需的最少步数,不能到达则输出-1
输入样例
1;1;0;0;1;1
1;2;0;0;1;2
2;2;0;0;2;0
复制样例
输出样例
-1
1
2
一般bfs:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int sx,sy,des_x,des_y;
string buf;
int dx[8]={1,1,-1,-1,2,2,-2,-2};
int dy[8]={2,-2,2,-2,1,-1,1,-1};
bool vis[1005][1005];
int x[1005*1005];
int y[1005*1005];
int depth[1005][1005];
int que[1005*1005];
int ans;
int bfs()
{
memset(vis,0,sizeof(vis));
int front=0;int tail=0;
x[tail]=sx;y[tail++]=sy;depth[sx][sy]=1;vis[sx][sy]=1;
int now_x,now_y,nxt_x,nxt_y;
while(front<=tail)
{
now_x=x[front];now_y=y[front++];
if(now_x==des_x&&now_y==des_y)
{
return depth[now_x][now_y]-1;
}
for(int i=0;i<8;i++)
{
nxt_x=now_x+dx[i];nxt_y=now_y+dy[i];
if(!vis[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
{
vis[nxt_x][nxt_y]=1;
x[tail]=nxt_x;y[tail++]=nxt_y;
depth[nxt_x][nxt_y]=depth[now_x][now_y]+1;
}
}
}
return -1;
}
int main()
{
// freopen("in.txt","r",stdin);
while(cin>>buf)
{
for(int i=0;i<buf.size();i++)
{
if(buf[i]==';')buf[i]=' ';
}
stringstream ss(buf);
ss>>n>>m>>sx>>sy>>des_x>>des_y;
ans=bfs();
printf("%d\n",ans);
}
return 0;
}
双向bfs:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<sstream>
using namespace std;
typedef long long ll;
int n,m;
int sx,sy,des_x,des_y;
string buf;
int dx[8]={1,1,-1,-1,2,2,-2,-2};
int dy[8]={2,-2,2,-2,1,-1,1,-1};
bool vis1[1005][1005];
int x_1[1005*1005];
int y_1[1005*1005];
int d1[1005][1005];
bool vis2[1005][1005];
int x_2[1005*1005];
int y_2[1005*1005];
int d2[1005][1005];
int ans;
int bfs()
{
memset(vis1,0,sizeof(vis1));memset(vis2,0,sizeof(vis2));
int f1=0;int t1=0;int f2=0;int t2=0;
d1[sx][sy]=0;d2[des_x][des_y]=0;
x_1[t1]=sx;y_1[t1++]=sy;x_2[t2]=des_x;y_2[t2++]=des_y;
vis1[sx][sy]=1;vis2[des_x][des_y]=1;
int now_x_1,now_y_1,now_x_2,now_y_2;
int nxt_x,nxt_y;
while(f1<=t1||f2<=t2)
{
now_x_1=x_1[f1];now_y_1=y_1[f1++];now_x_2=x_2[f2];now_y_2=y_2[f2++];
if(f1<=t1&&vis1[now_x_2][now_y_2])
{
return d1[now_x_2][now_y_2]+d2[now_x_2][now_y_2];
}
if(f2<=t2&&vis2[now_x_1][now_y_1])
{
return d2[now_x_1][now_y_1]+d1[now_x_1][now_y_1];
}
for(int i=0;i<8;i++)
{
nxt_x=now_x_1+dx[i];nxt_y=now_y_1+dy[i];
if(!vis1[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
{
vis1[nxt_x][nxt_y]=1;
d1[nxt_x][nxt_y]=d1[now_x_1][now_y_1]+1;
x_1[t1]=nxt_x;y_1[t1++]=nxt_y;
}
}
for(int i=0;i<8;i++)
{
nxt_x=now_x_2+dx[i];nxt_y=now_y_2+dy[i];
if(!vis2[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
{
vis2[nxt_x][nxt_y]=1;
d2[nxt_x][nxt_y]=d2[now_x_2][now_y_2]+1;
x_2[t2]=nxt_x;y_2[t2++]=nxt_y;
}
}
}
return -1;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>buf)
{
for(int i=0;i<buf.size();i++)
{
if(buf[i]==';')buf[i]=' ';
}
stringstream ss(buf);
ss>>n>>m>>sx>>sy>>des_x>>des_y;
ans=bfs();
printf("%d\n",ans);
}
return 0;
}
小米 oj 马走日 (bfs 或 双向bfs)的更多相关文章
- noi 8465 马走日
8465:马走日 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y ...
- Problem L: 搜索基础之马走日
Problem L: 搜索基础之马走日 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 134 Solved: 91[Submit][Status][W ...
- T1219:马走日
[题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第 ...
- 马走日的解法(dfs)
马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- Knight's Trip---hdu3766(马走日求最小走的步数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3766 给你一个x ,y 求出从(0,0)位置到达需要的最小步数每次只能走日型: 下图为暴力bfs得到的 ...
- 【算法】深度优先 马走日 Hamilton routes
在n*m的棋盘中,马只能走“日” 字.马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次.找出所有路径. ××××××××××××× 类似问题: 在半个中国象棋棋盘上,马在左下角(1,1)处 ...
- HDU1372,BFS象棋马走日
简单的对于bfs的运用,但是还是写的太慢了写了TMD的1H,主要是不熟悉,以后慢慢熟悉就好了,模型基本已经能建立了,主要出现bug是在方向数组的运用上面,一定要记得是从0开始的,而不是从1开始的,导致 ...
- NOI2.5 8465:马走日
描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T ...
随机推荐
- Python基础总结之第六天开始【先简单认识一次函数】(新手可相互督促)
午休后,看看电视,在回顾下新的知识----函数.相信很多小伙伴在学习python后 ,学到函数就会有一部分人放弃了,从努力到放弃(内容过于真实) 好希望我也能有很多粉丝,hhh.... 函数: 什么是 ...
- shell习题第13题:监控nginx进程
[题目要求] 在服务器上写一个脚本,要求如下 1. 每隔10秒去检查而一次服务器上的nginx进程数,如果>=500的时候,就需要自动重启一下nginx服务,并检测启动是否成功 2. 如没有正常 ...
- [javascript]localStorage和sessionStorage区别
一.sessionStorage.localStorage.cookie可查看的位置,F12=>Application: 二.cookie .sessionStorage与localStorag ...
- django+uwsgi+nginx: websock 报502/400
耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...
- thymeleaf 模板使用 提取公共页面
切记!!!thymeleaf模板的使用,姿势很重要!!!姿势不对,可能导致样式.js等的使用受到影响 前台开发中,由于页面目录结构不同,可能导致引入的公共页面中的的跳转路径在部分页面能用,部分页面不能 ...
- 爬虫遇到IP访问频率限制的解决方案
背景: 大多数情况下,我们遇到的是访问频率限制.如果你访问太快了,网站就会认为你不是一个人.这种情况下需要设定好频率的阈值,否则有可能误伤.如果大家考过托福,或者在12306上面买过火车票,你应该会有 ...
- asp.net 身份验证(Update)
ASP.NET 有四种 身份验证, 用的最广的就是 Froms 这几天 做项目 想用到 配置文件, 比较了 MVC 和ASP.NET 发现 还是 MVC 给力(MVC 叫做 过滤器 ...
- mysql 忘记密码如何修改
第一步:将服务停掉 /etc/init.d/mysqld stop 第二步:加参数启动服务 cd /application/mysql/bin/ mysqld_safe --skip-grant-ta ...
- 在SqlServer和Oralce中创建索引
给表名A的字段A增加索引 SqlServer: if exists (select 1 from sysobjects where name='表名A' and type='u')and exists ...
- 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...