poj_1915

来源:互联网 发布:网络综艺节目定位论文 编辑:程序博客网 时间:2024/05/24 07:38

上学期数据结构上机的时候就遇到这样的题目,但是当时因为心里畏惧就没有去做,放弃了本来可以拿到的分数~~

其实这道题目就是普通的深搜,把起始点压入队列,然后把接下来每个可以到达点的一次压进去,利用结构体里面的ans记录步数。。于是这道题就不是什么问题了。。。。

#include <iostream>#include <cstring>//#include <windows.h>#include <queue>using namespace std;struct Point{    int x,y;    int ans;    bool operator == ( const Point& tmp)    {        if(this->x == tmp.x && this->y == tmp.y)        return true;        else        return false;    }};bool visited[301][301];Point start,end;int len;bool tell(int x,int y){    if(x >= 0 && x <= len-1 && y >= 0 && y <= len-1)    return true;    return false;}int main(){    int t;    cin >> t;    while(t--)    {        cin >> len;        cin >> start.x >> start.y;        start.ans = 0;        cin >> end.x >> end.y;        if(start == end)        {            cout << 0 << endl;            continue;        }        memset(visited,false,sizeof(visited));        queue<Point> cj;        cj.push(start);        visited[start.x][start.y] = true;        while(!cj.empty())        {            Point tmp = cj.front();            if(tell(tmp.x-1,tmp.y-2) && !visited[tmp.x-1][tmp.y-2])            {                start.x = tmp.x-1;                start.y = tmp.y-2;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x-1][tmp.y-2] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x-1,tmp.y+2) && !visited[tmp.x-1][tmp.y+2])            {                start.x = tmp.x-1;                start.y = tmp.y+2;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x-1][tmp.y+2] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x+1,tmp.y-2) && !visited[tmp.x+1][tmp.y-2])            {                start.x = tmp.x+1;                start.y = tmp.y-2;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x+1][tmp.y-2] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x+1,tmp.y+2) && !visited[tmp.x+1][tmp.y+2])            {                //cout << "OK" << endl;                start.x = tmp.x+1;                start.y = tmp.y+2;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x+1][tmp.y+2] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x-2,tmp.y-1) && !visited[tmp.x-2][tmp.y-1])            {                start.x = tmp.x-2;                start.y = tmp.y-1;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x-2][tmp.y-1] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x-2,tmp.y+1) && !visited[tmp.x-2][tmp.y+1])            {                start.x = tmp.x-2;                start.y = tmp.y+1;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x-2][tmp.y+1] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x+2,tmp.y-1) && !visited[tmp.x+2][tmp.y-1])            {                start.x = tmp.x+2;                start.y = tmp.y-1;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x+2][tmp.y-1] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }            }            if(tell(tmp.x+2,tmp.y+1) && !visited[tmp.x+2][tmp.y+1])            {                //cout << "LL" << endl;                start.x = tmp.x+2;                start.y = tmp.y+1;                start.ans = tmp.ans + 1;                cj.push(start);                visited[tmp.x+2][tmp.y+1] = true;                if(start == end)                {                    cout << start.ans << endl;                    break;                }                //cout << "PP" << endl;            }            //cout << "OK" << endl;            cj.pop();        }    }    return 0;}