[bfs][A star][入门题]uva439 knightMoves

A*初步

A*要保证最短路一定要估价函数小于实际值,越接近越好

/*jerryRey
转载请注明出处,谢谢
http://www.cnblogs.com/jerryRey/
*/
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 8;
bool C[N][N];
struct node
{
   int g,h;
   int x, y;
   bool operator < (const node& rhs) const{
      if(g + h > rhs.g + rhs.h) return true;
      if(g + h < rhs.h + rhs.g ) return false;
      return g > rhs.g;
   }
};

int tax,tay;

inline void getH(node& o)
{
   o.h = (abs(o.x-tax)+abs(o.y-tay))>>1;
}

#define joinC(n) C[n.x][n.y] = true
int dx[] = {1,2, 1, 2,-1,-2,-1,-2};
int dy[] = {2,1,-2,-1,-2,-1, 2, 1};

int bfs(node &start)
{
   priority_queue<node> Q;
   memset(C,false,sizeof(C));
   Q.push(start);
   joinC(start);
   node cur,nxt;
   int i,nx,ny;
   while(Q.size()){
      cur = Q.top();Q.pop();
      if(cur.x == tax && cur.y == tay) return cur.g;
      for(i = 0; i < N; i++){
         nx = cur.x + dx[i];
         ny = cur.y + dy[i];
         if(nx >= N || nx < 0 || ny >= N || ny < 0 || C[nx][ny]) continue;
         nxt.x = nx ; nxt.y = ny; nxt.g = cur.g+1 ; getH(nxt);
         joinC(nxt);
         Q.push(nxt);
      }
   }
   return -1;
}

int main()
{
   node start;
   char fro[3],to[3];
   char ch;
   int n;
   while(~scanf("%s",fro)){
      scanf("%s",to);
      sscanf(fro,"%c",&ch);
      sscanf(fro+1,"%1d",&n);
      start.x = ch -‘a‘;
      start.y = n-1;
      start.g = 0;
      sscanf(to,"%c",&ch);
      sscanf(to+1,"%1d",&n);
      tax = ch - ‘a‘;
      tay = n-1;
      getH(start);
      printf("To get from %s to %s takes %d knight moves.\n",fro,to,bfs(start));
   }
   return 0;
}
时间: 2024-11-07 10:58:49

[bfs][A star][入门题]uva439 knightMoves的相关文章

poj 3984:迷宫问题(广搜,入门题)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要

hdu 3549 最大流入门题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 [科普]什么是BestCoder?如何参加? Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8862    Accepted Submission(s): 4168 Problem Description

二叉树学习——简单入门题

入门题一: 输入一颗二叉树.你的任务是按从上到下.从左到右的顺序输出各个节点的值.每一个节点都依照从根节点到它的移动序列给出 (L表示左,R表示右).在输入中,每一个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开. 每颗树的输入用一 对空括号()结束(这对空括号不代表节点) 注意,假设从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出了超出一次,应到输出 -1 .节点个数不超过256. 例子输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,R

hdu 2767 Proving Equivalences(强连通入门题)

1 /************************************************* 2 Proving Equivalences(hdu 2767) 3 强连通入门题 4 给个有向图,求至少加多少条边使得图是所有点都是强连通的 5 由a->b->c->a易知n个点至少要n条边,每个出度和入度都要大 6 于1.先求所有所有强连通分量,把每个强连通分量看成一个点 7 在找每个点的出度和入度,最后还差的出度和入度的最大值就是 8 答案. 9 10 ************

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t

hdu1796:容斥入门题

简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; long l

hdu1695 GCD(莫比乌斯入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 给出n.m.k ,求出1<=x<=n, 1<=y<=m 且gcd(x,y) == k 的(x,y)的对数 解析: 显然就是求 [1,n/k] 与 [1, m/k]有多少数对的最大公约数是1 莫比乌斯入门题 我们设 为满足且和的的对数 为满足且和的的对数 那么,很显然,反演后得到 我们所需要的答案便是  f(1) = ∑i=1μ(i)*(n/i)*(m/i)  ,求解这个式

网络流最经典的入门题 各种网络算法都能AC。

Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string&g

hdu 1754:I Hate It(线段树,入门题,RMQ问题)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33726    Accepted Submission(s): 13266 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求