UVA 439 Knight Moves --DFS or BFS
简单搜索,我这里用的是dfs,由于棋盘只有8x8这么大,于是想到dfs应该可以过,后来由于边界的问题,TLE了,改了边界才AC。
这道题的收获就是知道了有些时候dfs没有特定的边界的时候要自己设置一个合适的边界。这题推导可知,任意两点之间马踩6步之内一定能够到达,6步之内还未搜到说明绝对不是最优结果,果断退出。所以这里的res开始时最小设定为6即可,随着设的res的增大,运行时间越来越多,因为深搜可以有很多的分支,不采取较小的边界的话,可能会浪费很多时间在无用的搜索上,所以需要如此剪枝。
反复提交验证发现,res设不同值的运行时间如下:
res = 6 102ms
res = 10 222ms
res = 20 429ms
res = 30 929ms (过了30后极速增长)
res = 31 1692ms
res = 32 TLE !!!
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 9 int vis[N][N];
int res;
int dx[] = {,,-,-,,,-,-};
int dy[] = {,-,,-,,-,,-}; inline bool OK(int nx,int ny)
{
if(nx >= && nx <= && ny >= && ny <= && !vis[nx][ny])
return true;
return false;
} void dfs(int sx,int sy,int tx,int ty,int cnt)
{
if(cnt >= res)
return;
if(sx == tx && sy == ty && cnt < res)
{
res = cnt;
return;
}
for(int i=;i<;i++)
{
int nx = sx + dx[i];
int ny = sy + dy[i];
if(!OK(nx,ny))
continue;
vis[nx][ny] = ;
dfs(nx,ny,tx,ty,cnt+);
vis[nx][ny] = ;
}
return;
} int main()
{
char s1[],s2[];
int sx,sy,tx,ty;
while(scanf("%s%s",s1,s2)!=EOF)
{
sx = s1[] - 'a' + ;
tx = s2[] - 'a' + ;
sy = s1[] - '';
ty = s2[] - '';
memset(vis,,sizeof(vis));
vis[sx][sy] = ;
res = ; //·dfs边界,能取到正确的最小值最好,这里设为6或以上即可
dfs(sx,sy,tx,ty,);
printf("To get from %s to %s takes %d knight moves.\n",s1,s2,res);
}
return ;
}
UVA 439 Knight Moves --DFS or BFS的更多相关文章
- UVA 439 Knight Moves(BFS)
Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...
- UVA 439 Knight Moves
// 题意:输入标准国际象棋棋盘上的两个格子,求马最少需要多少步从起点跳到终点 BFS求最短路: bfs并维护距离状态cnt, vis记录是否访问过 #include<cstdio> ...
- uva 439 Knight Moves 骑士移动
这道题曾经写过,bfs.用队列,不多说了,上代码: #include<stdio.h> #include<stdlib.h> #include<string.h> ...
- 【UVa】439 Knight Moves(dfs)
题目 题目 分析 没有估价函数的IDA...... 代码 #include <cstdio> #include <cstring> #include <a ...
- UVa 439骑士的移动(BFS)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Knight Moves (双向bfs)
# 10028. 「一本通 1.4 例 3」Knight Moves [题目描述] 编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数.骑士一步可以移动到的位置由下图给出. [算法 ...
- H - Knight Moves DFS
A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...
- Knight Moves UVA - 439
A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...
- HDU 1372 Knight Moves (bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...
随机推荐
- linux系统如何将系统中的文件名改为英文?
由于我们经常在命令行模式下进入文件,那么中英文的切换常常会影响我们输入的效率. 那么如何将原来的中文修改成英文的字幕呢? 如下图所示: -------------------------------- ...
- 用EF6更新数据库时出现外键错误解决方式
在“Package Manager Console”中执行update-database命令,出现异常信息: Introducing FOREIGN KEY constraint 'FK_dbo.Pr ...
- galera cluster各种问题专贴
dbforge在galera cluster下debug存储过程hang... 经查看process list,dbforge cr_debug引擎使用了use_lock()函数,而galera cl ...
- 六个创建模式之工厂方法模式(Factory Method Pattern)
问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- Iscroll应用文档
Iscroll是一个非常不错的区域滑动插件. 不过它有个小小的不足,就是它的说明文档. 全英文不说,整理的也不咋好,官网上看着很乱,不容易查阅. 因此上网找了一些相关的文档说明并加以整理. Iscro ...
- andriod 动态显示当前时间
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android=&quo ...
- GitHub 基本常用知识解答
1.Fork.Watch.Star 是什么意思? fork的意思是从别人的代码库中复制一份到你自己的代码库,与普通的复制不同,fork包含了原有库中的所有提交记录, fork后这个代码库是完全独立的, ...
- DDMS无法查看data/data目录?
今天andorid 学习用真机来尝试用Android SQLite数据库时,从DDMS的FileExplore查看数据库文件时会发现里面是空的什么也没有,之前用的一直都是模拟器,现如今用真机 捣鼓了小 ...
- 大家一起和snailren学java-(六)复用类
“失恋了,唉,还没开始就结束了……唉……继续看java” 今天又是周末,我们来看看java的复用机制是什么情况.大家知道,代码复用非常实用,这项特性是java的一个重要的部分.那java用什么来实现的 ...