标签:namespace val poi ble nod src 技术 pst mon
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 22121 | Accepted: 10332 |
Description
The Problem
Your task is to write a program to calculate the minimum number of moves needed for a knight to reach one point from another, so that you have the chance to be faster than Somurolov.
For people not familiar with chess, the possible knight moves are shown in Figure 1.
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
分析:最基础的bfs,没用单向的广搜,学习了一下怎么用双向的广搜。
下面仅个人观点。
。。
能用到双向广搜的题,首先得有開始点和目标点。然后就是从開始和目标同一时候出发,分别进行单向搜索,知道某一方向的搜索碰到还有一方向搜索过得点为止。。
#include <stdio.h> #include <queue> #include <string.h> #define M 305 using namespace std; int dis1[M][M], dis2[M][M], len; const int dx[] = {1, 1, -1, -1, 2, 2, -2, -2}; //方向 const int dy[] = {2, -2, 2, -2, 1, -1, 1, -1}; struct node{ int x, y; }st, en; int limit(node a){ return (a.x>=0&&a.x<len&&a.y>=0&&a.y<len); } void dobfs(){ int i, size; dis1[st.x][st.y] = dis2[en.x][en.y] = 0; queue<node> p, q; q.push(st); p.push(en); while(!q.empty()&&!p.empty()){ size = q.size(); while(size --){ node cur = q.front(); q.pop(); if(limit(cur)&&dis2[cur.x][cur.y] != -1){ //printf("%d %d..1\n", dis1[cur.x][cur.y], dis2[cur.x][cur.y]); printf("%d\n", dis1[cur.x][cur.y]+dis2[cur.x][cur.y]); return ; } for(i = 0; i < 8; i ++){ node temp = cur; temp.x+=dx[i], temp.y += dy[i]; if(limit(temp)&&dis2[temp.x][temp.y] != -1){ //printf("%d %d....1\n", dis1[cur.x][cur.y], dis2[temp.x][temp.y]); printf("%d\n", dis1[cur.x][cur.y]+dis2[temp.x][temp.y]+1); return ; } if(limit(temp)&&dis1[temp.x][temp.y] == -1){ q.push(temp); dis1[temp.x][temp.y] = dis1[cur.x][cur.y]+1; } } } size = p.size(); while(size --){ node cur = p.front(); p.pop(); if(limit(cur)&&dis1[cur.x][cur.y] != -1){ //printf("%d %d..2\n", dis1[cur.x][cur.y], dis2[cur.x][cur.y]); printf("%d\n", dis1[cur.x][cur.x]+dis2[cur.x][cur.y]); return ; } for(i = 0; i < 8; i ++){ node temp = cur; temp.x += dx[i]; temp.y += dy[i]; if(limit(temp)&&dis1[temp.x][temp.y] != -1){ //printf("%d %d....2\n", dis2[cur.x][cur.y], dis1[temp.x][temp.y]); printf("%d\n", dis1[temp.x][temp.y]+dis2[cur.x][cur.y]+1); return ; } if(limit(temp)&&dis2[temp.x][temp.y] == -1){ p.push(temp); dis2[temp.x][temp.y] = dis2[cur.x][cur.y] + 1; } } } } } int main(){ int t; scanf("%d", &t); while(t --){ scanf("%d", &len); scanf("%d%d%d%d", &st.x, &st.y, &en.x, &en.y); memset(dis1, -1, sizeof(dis1)); memset(dis2, -1, sizeof(dis2)); if(match(st, en)){ printf("0\n"); continue; } else dobfs(); } return 0; }
标签:namespace val poi ble nod src 技术 pst mon
原文地址:http://www.cnblogs.com/ljbguanli/p/6819477.html