应该也不算一题多解。

就是闲的。。也是因为这题比较简单而且在网上看了别人写的特别好,就想用这题当入门练一下(逃

https://vjudge.net/problem/POJ-2243

题意:

8*8的棋盘,马走斜日,马走几步可以达到给出的终点?

方法一:传统BFS,就不再赘述了,很简单啦。

#include

#include

#include

#include

#define bug cout<

using namespace std;

char a1,a2,b1,b2;

int map[8][8];

struct data{

int xi,yi;

};

int dx[8]={1,2,2,1,-1,-2,-2,-1};

int dy[8]={2,1,-1,-2,-2,-1,1,2};

int judge(data temp,int x2,int y2){

if(temp.xi==x2&&temp.yi==y2) return 1;

return 0;

}

int bfs(int x1,int y1,int x2,int y2){

memset(map,-1,sizeof(map));

queueque;

data in;

in.xi=x1;

in.yi=y1;

que.push(in);

map[in.xi][in.yi]=0;

while(!que.empty()){

data top,ou;

top=que.front();

que.pop();

if(judge(top,x2,y2)) return map[top.xi][top.yi];

for(int i=0;i<8;i++){

ou.xi=top.xi+dx[i];

ou.yi=top.yi+dy[i];

if(map[ou.xi][ou.yi]==-1&&ou.xi>=0&&ou.xi<8&&ou.yi>=0&&ou.yi<8){

que.push(ou);

map[ou.xi][ou.yi]=map[top.xi][top.yi]+1;

}

}

}

return 0;

}

int main(){

//freopen("test.txt","r",stdin);

while(cin>>a1>>a2>>b1>>b2){

int ans=bfs(a1-'a',a2-'1',b1-'a',b2-'1');

printf("To get from %c%c to %c%c takes %d knight moves.\n",a1,a2,b1,b2,ans);

}

return 0;

}

顺便在这里加一个小技巧。之前有和同学说过这个。

结构体其实是可以和类一样用的。可以非默认构造,如果要非默认构造的话,要记得加一个默认构造函数。

还有一个就是为什么结构体不能放在set啊,map啊里面。

因为set和map的底层是红黑树。红黑树的话他对内部对象就会排序。就要重载一下小于号。自定义一个小于号。

#include

#include

#include

#include

using namespace std;

struct data{

int x,y;

data(int dx,int dy){

x=dx,y=dy;

}

data(){}

bool operator const data b)const{

return x==b.x?xint main(){

data temp1(1,1);

data temp2(2,2);

setse;

se.insert(temp1);

se.insert(temp2);

if(se.count(temp1)) cout

}

方法二:传统DFS。这个还真的蛮。。。有点小意思吧。而且对这道题的分类也是BFS(hhh分类的人可能是TLE了DFS

我写了一个我认为很对的剪枝其实并没有剪到什么(逃

我还感觉写得蛮对的。结果TLE了两发。。。这我就很不能理解啦。

我一开始DFS函数是这么写的。

void dfs(int x1,int y1,int x2,int y2,int step){

if(judge(x1,y1,x2,y2)){

ans=min(ans,step);

return;

}

if(step>=ans) return;//这就是我说的没什么用的剪枝,发现当前步数(不管找到了没有)比ans大了就直接剪掉。其实也减到了不少,但是对这道题来说确实是。。。嗯。。不够。

for(int i=0;i<8;i++){

int xx=dx[i]+x1;

int yy=dy[i]+y1;

if(map[xx][yy]==-1&&xx>=0&&xx<8&&yy>=0&&yy<8){

map[xx][yy]=1;

dfs(xx,yy,x2,y2,step+1);

map[xx][yy]=-1;

}

}

}

超有道理的。对不对。

随后想到,如果我想要剪枝跟有效那我是不是要使ans迅速的变小或者使每一步都能判断出他是否有效。

于是,如果对于一个点 map[x][y]我已经到过这个点,并且我上次到这一点的步数小于这一次的,(这是深搜嘛,广搜就不会遇到这样的问题。)那当前我这条路走下去肯定没有上一次那么走棒,所以我可以对map数组进行更新,使得map数组里的值尽量地小,这样就方便我下一次把它剪掉。

其实也很容易就想到了。

#include

#include

#include

#include

#define bug cout<

using namespace std;

char a1,a2,b1,b2;

int map[8][8];

int dx[8]={1,2,2,1,-1,-2,-2,-1};

int dy[8]={2,1,-1,-2,-2,-1,1,2};

int judge(int x1,int y1,int x2,int y2){

if(x1==x2&&y1==y2) return 1;

return 0;

}

int ans=1e9+7;

void dfs(int x1,int y1,int x2,int y2,int step){

if(judge(x1,y1,x2,y2)){

ans=min(ans,step);

return;

}

if(map[x1][y1]==-1||map[x1][y1]>step) map[x1][y1]=step;

if(map[x1][y1]return;

if(step>=ans) return;

for(int i=0;i<8;i++){

int xx=dx[i]+x1;

int yy=dy[i]+y1;

if(xx>=0&&xx<8&&yy>=0&&yy<8){

dfs(xx,yy,x2,y2,step+1);

}

}

}

int main(){

//freopen("test.txt","r",stdin);

while(cin>>a1>>a2>>b1>>b2){

memset(map,-1,sizeof(map));

map[a1-'a'][a2-'1']=1;

ans=1e9+7;

dfs(a1-'a',a2-'1',b1-'a',b2-'1',0);

printf("To get from %c%c to %c%c takes %d knight moves.\n",a1,a2,b1,b2,ans);

}

return 0;

}

因为很久没有写搜索了,所以。。。练个手。

这题还有很多种解法,我会陆续写出双向BFS,A*和纯数学解法(感觉很厉害的样子呢)。

马走日poj java超时_简单搜索poj 2243(水相关推荐

  1. 马走日 java实现

    马走日 问题描述: 在中国象棋里,马的走棋要遵循"马走日"的规则,在本题中,给定马的起始位置,以及一个目标位置,判定该马是否能够走到该位置,如果能走到,最少步数是多少.(假设棋盘上 ...

  2. 马走日问题(Java版)

    马走日问题(Java版) 问题描述 算法描述 参考代码 问题描述 给定 n*m 大小的棋盘,起点坐标(x, y),找出从起点开始,将棋盘所有位置走一遍,求总的方案数Sum. 限制条件:只能走日字型. ...

  3. 【简洁,易懂程式】C - 马走日

    [简洁,易懂程式]C - 马走日 题目: 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y), 要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历 ...

  4. [计蒜客]马走日-c++

    hi!大家好: 最近几天看了问答,发现有一些人在刷采纳,我就不说是谁了,建议官方处理一下: 好了,回到正题,最近几天,有个朋友问我了很多BFS的题 我打着打着就有点蒙,难的题对了,简单的题错了...就 ...

  5. 东华码蹄集第21周oj赛(光潮的幻像,分苹果,马走日,码哥猜想)

    小码哥在雪山闲逛的时候发现了一个神秘的序列.他发现如果按照一定的方式对这个序列进行操作,就可以得到一些隐藏的线索.这个序列含有n个整数,你需要对其进行m 次操作,操作分为两种: 1.给出下标α和整数y ...

  6. 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs

    题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...

  7. 信息学奥赛一本通(1219:马走日)

    1219:马走日 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 12078     通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...

  8. 马走日程序Java_马走日什么意思

    中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...

  9. Bailian4123 马走日【DFS】

    4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...

最新文章

  1. js笔记之Math random()、ceil()、floor()、round()
  2. 腾讯云加入自媒体分享计划可以免费领取.cn域名啦
  3. java mysql数据库编程_java JDBC数据库(mysql)编程
  4. Struts 2初体验
  5. CentOS7下使用yum安装MariaDB
  6. [原]ASP.Net常用功能整理--生成图片的缩略图
  7. 怎样获取不同域名的ifram的html,AJAX | iframe跨域的实现方法
  8. 《精通Spring 4.x 企业应用开发实战》读书笔记
  9. Delphi使用经验笔记。
  10. 一文浓缩 60 年,程序员不可不知的开源秘史!
  11. 里氏替换原则_春辉带你了解面相对象设计第二原则(里氏替换原则)
  12. ubuntu 15.10 升级 到Ubuntu 16.04.3 LTS
  13. 模拟手机端来爬取数据
  14. c++超级简单的计算器
  15. Python类王者荣耀小游戏
  16. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理
  17. SharePoint 2013的限制(三)非法字符
  18. h5页面自定义字体_H5页面视觉设计中的字体有哪几种
  19. 删除的照片如何恢复?SD卡数据恢复妙招
  20. suse enterprise linux 10 安装及配置svn(使用svnserve)

热门文章

  1. 现存问题以及解决方案:在ASP.NET AJAX中从客户端向服务器端传送DataTable
  2. C++ Testing Framework
  3. iOS性能优化 启动
  4. windows10安装Oracle提示错误-INS-13001环境不满足最低要求
  5. [redis] Redis 常用命令
  6. 关于bcg库记忆界面的问题及其解决办法
  7. 使用iostat分析IO性能
  8. PC机键盘的处理过程
  9. ListView添加项目
  10. UML-类图-需要写关联名称吗?