马走日

序号:#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;1;0;0;1;1
  2. 1;2;0;0;1;2
  3. 2;2;0;0;2;0

复制样例

输出样例

  1. -1
  2. 1
  3. 2

一般bfs:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int n,m;
  5. int sx,sy,des_x,des_y;
  6. string buf;
  7. int dx[8]={1,1,-1,-1,2,2,-2,-2};
  8. int dy[8]={2,-2,2,-2,1,-1,1,-1};
  9. bool vis[1005][1005];
  10. int x[1005*1005];
  11. int y[1005*1005];
  12. int depth[1005][1005];
  13. int que[1005*1005];
  14. int ans;
  15. int bfs()
  16. {
  17. memset(vis,0,sizeof(vis));
  18. int front=0;int tail=0;
  19. x[tail]=sx;y[tail++]=sy;depth[sx][sy]=1;vis[sx][sy]=1;
  20. int now_x,now_y,nxt_x,nxt_y;
  21. while(front<=tail)
  22. {
  23. now_x=x[front];now_y=y[front++];
  24. if(now_x==des_x&&now_y==des_y)
  25. {
  26. return depth[now_x][now_y]-1;
  27. }
  28. for(int i=0;i<8;i++)
  29. {
  30. nxt_x=now_x+dx[i];nxt_y=now_y+dy[i];
  31. if(!vis[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
  32. {
  33. vis[nxt_x][nxt_y]=1;
  34. x[tail]=nxt_x;y[tail++]=nxt_y;
  35. depth[nxt_x][nxt_y]=depth[now_x][now_y]+1;
  36. }
  37. }
  38. }
  39. return -1;
  40. }
  41. int main()
  42. {
  43. // freopen("in.txt","r",stdin);
  44. while(cin>>buf)
  45. {
  46. for(int i=0;i<buf.size();i++)
  47. {
  48. if(buf[i]==';')buf[i]=' ';
  49. }
  50. stringstream ss(buf);
  51. ss>>n>>m>>sx>>sy>>des_x>>des_y;
  52. ans=bfs();
  53. printf("%d\n",ans);
  54. }
  55. return 0;
  56. }

双向bfs:

  1. #include<iostream>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #include<algorithm>
  5. #include<sstream>
  6. using namespace std;
  7. typedef long long ll;
  8. int n,m;
  9. int sx,sy,des_x,des_y;
  10. string buf;
  11. int dx[8]={1,1,-1,-1,2,2,-2,-2};
  12. int dy[8]={2,-2,2,-2,1,-1,1,-1};
  13. bool vis1[1005][1005];
  14. int x_1[1005*1005];
  15. int y_1[1005*1005];
  16. int d1[1005][1005];
  17. bool vis2[1005][1005];
  18. int x_2[1005*1005];
  19. int y_2[1005*1005];
  20. int d2[1005][1005];
  21. int ans;
  22. int bfs()
  23. {
  24. memset(vis1,0,sizeof(vis1));memset(vis2,0,sizeof(vis2));
  25. int f1=0;int t1=0;int f2=0;int t2=0;
  26. d1[sx][sy]=0;d2[des_x][des_y]=0;
  27. x_1[t1]=sx;y_1[t1++]=sy;x_2[t2]=des_x;y_2[t2++]=des_y;
  28. vis1[sx][sy]=1;vis2[des_x][des_y]=1;
  29. int now_x_1,now_y_1,now_x_2,now_y_2;
  30. int nxt_x,nxt_y;
  31. while(f1<=t1||f2<=t2)
  32. {
  33. now_x_1=x_1[f1];now_y_1=y_1[f1++];now_x_2=x_2[f2];now_y_2=y_2[f2++];
  34. if(f1<=t1&&vis1[now_x_2][now_y_2])
  35. {
  36. return d1[now_x_2][now_y_2]+d2[now_x_2][now_y_2];
  37. }
  38. if(f2<=t2&&vis2[now_x_1][now_y_1])
  39. {
  40. return d2[now_x_1][now_y_1]+d1[now_x_1][now_y_1];
  41. }
  42. for(int i=0;i<8;i++)
  43. {
  44. nxt_x=now_x_1+dx[i];nxt_y=now_y_1+dy[i];
  45. if(!vis1[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
  46. {
  47. vis1[nxt_x][nxt_y]=1;
  48. d1[nxt_x][nxt_y]=d1[now_x_1][now_y_1]+1;
  49. x_1[t1]=nxt_x;y_1[t1++]=nxt_y;
  50. }
  51. }
  52. for(int i=0;i<8;i++)
  53. {
  54. nxt_x=now_x_2+dx[i];nxt_y=now_y_2+dy[i];
  55. if(!vis2[nxt_x][nxt_y]&&nxt_x>=0&&nxt_x<=n&&nxt_y>=0&&nxt_y<=m)
  56. {
  57. vis2[nxt_x][nxt_y]=1;
  58. d2[nxt_x][nxt_y]=d2[now_x_2][now_y_2]+1;
  59. x_2[t2]=nxt_x;y_2[t2++]=nxt_y;
  60. }
  61. }
  62. }
  63. return -1;
  64. }
  65. int main()
  66. {
  67. //freopen("in.txt","r",stdin);
  68. while(cin>>buf)
  69. {
  70. for(int i=0;i<buf.size();i++)
  71. {
  72. if(buf[i]==';')buf[i]=' ';
  73. }
  74. stringstream ss(buf);
  75. ss>>n>>m>>sx>>sy>>des_x>>des_y;
  76. ans=bfs();
  77. printf("%d\n",ans);
  78. }
  79. return 0;
  80. }

小米 oj 马走日 (bfs 或 双向bfs)的更多相关文章

  1. noi 8465 马走日

    8465:马走日 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y ...

  2. Problem L: 搜索基础之马走日

    Problem L: 搜索基础之马走日 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 134  Solved: 91[Submit][Status][W ...

  3. T1219:马走日

    [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第 ...

  4. 马走日的解法(dfs)

    马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...

  5. BFS、双向BFS和A*

    BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...

  6. Knight's Trip---hdu3766(马走日求最小走的步数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3766 给你一个x ,y 求出从(0,0)位置到达需要的最小步数每次只能走日型: 下图为暴力bfs得到的 ...

  7. 【算法】深度优先 马走日 Hamilton routes

    在n*m的棋盘中,马只能走“日” 字.马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次.找出所有路径. ××××××××××××× 类似问题: 在半个中国象棋棋盘上,马在左下角(1,1)处 ...

  8. HDU1372,BFS象棋马走日

    简单的对于bfs的运用,但是还是写的太慢了写了TMD的1H,主要是不熟悉,以后慢慢熟悉就好了,模型基本已经能建立了,主要出现bug是在方向数组的运用上面,一定要记得是从0开始的,而不是从1开始的,导致 ...

  9. NOI2.5 8465:马走日

    描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T ...

随机推荐

  1. 连续取数字DP使值最大HDU2697

    题意: 有n个数,每个数都有价钱,连续的取可以获得len*len的利益,使利益最大. 思路: 三维DP,1.2.3维分别是第i个,剩余多少钱,从后往前连续的有几个. #define IOS ios_b ...

  2. VMware与主机联网设置

    1.编辑-虚拟机网络编辑器 2.虚拟机设置 3. 4.主机ping虚拟机

  3. C++通用框架和库

    C++通用框架和库 来源 https://www.cnblogs.com/skyus/articles/8524408.html 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应 ...

  4. 【js】null 和 undefined的区别?

    1.首先看一个判断题:null和undefined 是否相等     console.log(null==undefined)//true     console.log(null===undefin ...

  5. Makefile中 -I -L -l区别

    我们用gcc编译程序时,可能会用到"-I"(大写i),"-L"(大写l),"-l"(小写l)等参数,下面做个记录: 例: gcc -o he ...

  6. luogu P3773 [CTSC2017]吉夫特

    luogu 这里的组合数显然要用\(\text{lucas}\)定理来求,所以考虑\(\text{lucas}\)定理的本质,即把\(n,m\)分别拆分成\(p\)进制串\(\{a\}\{b\}\), ...

  7. 解决 vue 使用 element 时报错ERROR in ./node_modules/element-ui/lib/theme-chalk/fonts/element-icons.ttf

    在 webpack.config.js 中加入这个依赖 { test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/, loader: 'file-loader' }

  8. 嵌入式安装telnet

    busybox配置 Defined at networking/Config.in:784 Depends on: TELNET Location: -> Networking Utilitie ...

  9. liunx pip安装

    方法一 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py 方法二 wget https://pypi.python.org/pac ...

  10. LINUX 使用grep命令查看某个指定时间段的日志

    今天查看订单重复的问题,由于订单生成已经有一段时间了,所以我必须精准进行日志查询.开始用的是sed 命令查询法,后来改成了grep查询,很方便. 命令: grep '时间' '日志文件名 ' 例如:我 ...