• Knight Moves(POJ1915)


     

     通过广搜, 向如图所示的8个方向搜索, 边搜索边记录步数, 最后若到达终点则返回当前走过的步数, 否则返回0

    #include <iostream>
    #include <queue>
    #include <cstring>
    using namespace std;
    
    struct node
    {
    	int x, y;	// 当前点的坐标 
    	int step;	// 当前走的步数
    	node() {}
    	node(int x1, int y1):x(x1), y(y1) {} 
    };
    
    int n, l;
    int map[310][310], vis[310][310];
    int dir[8][2] = {{2,1},{1,2},{-1,2},{-2,1},{-1,-2},{-2,-1},{1,-2},{2,-1}};
    node s, e;
    
    int bfs()
    {
    	queue<node> q;
    	node p, t;
    	int dx, dy;
    	s.step = 0;
    	vis[s.x][s.y] = 1;
    	q.push(s);
    	while(!q.empty())
    	{
    		p = q.front();
    		q.pop();
    		
    		if(p.x == e.x && p.y == e.y)	return p.step;
    		
    		for(int i = 0; i < 8; ++ i)
    		{
    			dx = p.x + dir[i][0];
    			dy = p.y + dir[i][1];
    			
    			if(dx < 0 || dx >= l || dy < 0 || dy >= l || vis[dx][dy])	
    				continue;
    				
    			t = node(dx, dy);
    			t.step = p.step + 1;
    			vis[t.x][t.y] = 1;
    			q.push(t);
    		}
    	}
    	return 0;
    }
    
    int main()
    {
    	cin >> n;
    	while(n --)
    	{
    		memset(vis, 0, sizeof(vis));
    		cin >> l;
    		cin >> s.x >> s.y;
    		cin >> e.x >> e.y;
    		cout << bfs() << endl;
    	}
    	
    	return 0;
    }
    
    /*
    Sample Input:
    3
    8
    0 0
    7 0
    100
    0 0
    30 50
    10
    1 1
    1 1
    
    Sample Output:
    5
    28
    0
    */
    

      

  • 相关阅读:
    类的加载顺序
    自定义形状类
    java的参数传递
    复数相加+equels、hashcode、clone<二>
    复数相加+equels、hashcode、clone<一>
    命令行程序
    计算阶乘
    控制程序的流程
    java运算符
    强制类型转换细节解析
  • 原文地址:https://www.cnblogs.com/mjn1/p/11566917.html
Copyright © 2020-2023  润新知