UVA 439 Knight Moves

来源:互联网 发布:程序员找工作最佳月份 编辑:程序博客网 时间:2024/05/16 03:25

题目:给出国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。

#include <iostream>#include<queue>using namespace std;struct RA{    int c;    int  r;    RA(int a = 0, int b = 0){c = a; r = b;};    RA(char a,char b){c = int(a - 'a');r = int(b -'1');};    char ioc(){return char(c+int('a'));};    char ioi(){return char(r + int('1'));};    bool friend operator == (RA a, RA b){return (a.c == b.c)&&(a.r == b.r);};};const int SIZE = 8;class Knight{private:    RA SA;    RA SB;    int board[SIZE][SIZE];public:    void initial();    bool readData();    void computing();    void outResult();};void Knight::initial() {for(int i = 0;i < SIZE; i++){    for(int j = 0; j < SIZE; j++)        board[i][j]=-2;}}bool Knight::readData(){char c,r;cin>>c>>r;SA = RA(c,r);cin>>c>>r;SB = RA(c, r);return !cin.eof();}void Knight::outResult(){cout<<"To get from "<<SA.ioc()<<SA.ioi();cout<<" to "<<SB.ioc()<<SB.ioi()<<" takes ";cout<<board[SB.c][SB.r]<<" knight moves."<<endl;}void Knight::computing(){RA ns,s;const int dr[8]={2,1,-1,-2,-2,-1,1,2};const int dc[8]={1,2,2,1,-1,-2,-2,-1};queue<RA> q;board[SA.c][SA.r] = 0;q.push(SA);while(!q.empty()){    s = q.front();    q.pop();    if(s == SB)        break;    else{        for(int i = 0; i < 8; i++){            ns = RA(s.c + dc[i], s.r + dr[i]);            if((0 <= ns.c)&&(ns.c < 8)&&(0 <= ns.r)&&(ns.r < 8))            {                if(board[ns.c][ns.r] < 0){                    board[ns.c][ns.r] = 1 + board[s.c][s.r] ;                    q.push(ns);                }            }        }    }}}int main(){    Knight ss;    while(ss.readData()){        ss.initial();        ss.computing();        ss.outResult();    }    return 0;}

0 0
原创粉丝点击