zoukankan      html  css  js  c++  java
  • (step4.2.1) hdu 1372(Knight Moves——BFS)

    解题思路:BFS


    1)马的跳跃方向

    在国际象棋的棋盘上,一匹马共有8个可能的跳跃方向,如图1所示,按顺时针分别记为1~8,设置一组坐标增量来描述这8个方向;


    2)基本过程

    设当前点(i,j),方向k,沿方向k跳一步后的新点(newi,newj);每走一步,都要判断新点(newi,newj)是否还在棋盘上:

    若1£newi£8且1£newj£8,则新点仍在棋盘上,则还需判断该点是否已经走过,即

    若visited[newi][newj]=0,表示该步可走;

    若visited[newi][newj]=1,表示该点已经走过,不能再走,放弃当前方向,并转向下一个方向试探;

    否则,直接放弃当前方向,并转向下一个方向试探;


    本题其实BFS的模板题。照着模板写就是了。。。。

    代码如下:

     

    /*
     * 1372_1.cpp
     *
     *  Created on: 2013年8月15日
     *      Author: Administrator
     */
    
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    char str1[5],str2[5];
    
    const int maxn = 100;
    bool visited[maxn][maxn];
    
    //*
    int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
    
    struct State{
    	int x;
    	int y;
    	int step_counter;
    };
    
    bool checkState(State st){
    
    	//*
    	if(!visited[st.x][st.y]&&(!(st.x <0 ||st.x >= 8 ||st.y <0 ||st.y >=8))){
    		return true;
    	}
    
    	return false;
    }
    
    int bfs(){
    
    
    	queue<State> q;
    	State st;
    	State now ,next;
    	int x_e,y_e;
    
    
    	//*
    	st.x = str1[1] - '1';
    	st.y = str1[0] - 'a';
    	st.step_counter = 0;
        x_e = str2[1] - '1';
        y_e = str2[0] - 'a';
    
    	q.push(st);
    	memset(visited,0,sizeof(visited));
    	visited[st.x][st.y] = 1;
    	while(!q.empty()){
    		now = q.front();
    
    		if(now.x == x_e && now.y == y_e){
    			return now.step_counter;
    		}
    		int i;
    		for(i = 0 ; i < 8 ; ++i){
    			next.x = now.x + dir[i][0];
    			next.y = now.y + dir[i][1];
    			next.step_counter = now.step_counter + 1;
    
    
    			if(checkState(next)){
    				q.push(next);
    				visited[next.x][next.y] = 1;
    			}
    		}
    		q.pop();
    
    	}
    
    
    	return -9;
    }
    
    
    int main(){
    
    	int ans;
    	while(scanf("%s%s",str1,str2)!=EOF){
    		ans = bfs();
    		printf("To get from %s to %s takes %d knight moves.
    ",str1,str2,ans);
    	}
    }
    
    
  • 相关阅读:
    Jenkins知识地图
    PageObject&PageFactory
    robot framework-databaselibaray库使用(python)
    robot framework环境搭建
    使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库(转)
    (转)pip和easy_install使用方式
    图解:如何在LINUX中安装VM-Tools
    ANT简明教程[转载]
    Linux常用命令
    oracle数据分组
  • 原文地址:https://www.cnblogs.com/riskyer/p/3260398.html
Copyright © 2011-2022 走看看