Fork me on GitHub


题目1365:贝多芬第九交响曲
时间限制:1 秒内存限制:32 兆特殊判题:否提交:262解决:69
题目描述:
         也许不是所有人都知道贝多芬的“第九交响曲”,但是所有人都一定知道《欢乐颂》这首歌,它就是来自于贝多芬第九交响曲《合唱》的第四乐章,玄影游侠受朋友推荐听了这部交响曲,并且被这部交响曲深深地打动。

         2012年的1月1日上午,在奥地利首都维也纳新年音乐会上,音乐家们会演奏这首交响曲,他现在非常想去现场感受一下。但是他还是学生,并没有很多积蓄。音乐会的举办方考虑到一些学生的实际情况,他们专门安排了一个智力挑战赛,完成挑战赛的人将免费获得一张维也纳音乐会的门票。
         挑战赛规则如下:
         现在在一块空的场地上会有一个大的二维棋盘,裁判会给你指定初始位置及一座贝多芬雕像所处的位置,你开始时就站在裁判指定的初始位置处,你的目标是跳到贝多芬雕像的位置。为了给比赛增加一定的难度,你在棋盘上行走时,必须按照中国象棋中的马的走步方式来走。玩过中国象棋的人都知道,马走“日”,象走“田”。最后,你只需要告诉裁判最少多少步能到达贝多芬的雕像。如果根本就到不了贝多芬的雕像处,你直接告诉裁判就可以了。
         玄影游侠站在棋盘的某一个位置,不知道该如何走,他知道你们都学过程序设计,所以想请你们帮帮忙编一个程序来帮助他找到想要到达贝多芬的雕像处所需要的最少的步数。
输入:
         每组测试数据可能有多组输入,对于每一组输入,
         输入的第一行包括一个整数N(1<=N<=100),代表棋盘的大小是N*N。
         输入的第二行包括四个数start_x, start_y, end_x, end_y(1 <= start_x,start_y,end_x,end_y <= N),分别代表你开始时的位置的x坐标和y坐标以及贝多芬雕像的x坐标和y坐标。
输出:
         如果你能够到达贝多芬雕像的位置,请输出最少需要多少步。
         如果不能到达,则输出-1。
样例输入:
3
1 1 3 2
3
1 1 2 2
样例输出:
1
-1
提示:
         注意,棋盘并不是中国象棋的棋盘,你可以把它理解成N*N的类似于五子棋的棋盘。

 


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 110
 
int n, sx, sy, ex, ey;
int q[N * N][3];
int d[8][2] = {{2, 1}, {2, -1}, {1, 2}, {1, -2}, {-2, 1}, {-2, -1}, {-1, 2}, {-1, -2}};
bool vis[N][N];
 
bool check(int x, int y) {
    if(!vis[x][y] && x > 0 && x <= n && y > 0 && y <= n) return true;
    return false;
}
 
int BFS() {
    if(sx == ex && sy == ey) return 0;
    int i, l = 0, r = 1, tx, ty;
    q[0][0] = sx; q[0][1] = sy; q[0][2] = 0;
    while(l < r) {
        for(i = 0; i < 8; ++i) {
            tx = q[l][0] + d[i][0];
            ty = q[l][1] + d[i][1];
            //printf("%d %d\n", tx, ty);
            if(check(tx, ty)) {
                vis[tx][ty] = 1;
                q[r][0] = tx; q[r][1] = ty; q[r][2] = q[l][2] + 1;
                if(tx == ex && ty == ey) return q[r][2];
                ++r;
            }
        }
        ++l;
    }
    return -1;
}
 
int main() {
    while(~scanf("%d", &n)) {
        memset(vis, false, sizeof(vis));
        scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
        printf("%d\n", BFS());
    }
    return 0;
}
/**************************************************************
    Problem: 1365
    User: Uriel
    Language: C++
    Result: Accepted
    Time:350 ms
    Memory:1168 kb
************************
600 ms
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include <map>
using namespace std;
class node
{
public:int x,y,t;
};
int  n;
bool flag,mark[101][101];
int go[8][2]=
{
    1,2,
        -1,2,
        2,1,
        -2,1,
        1,-2,
        2,-1,
        -2,-1,
        -1,-2
};
queue<node> q;
int sx,sy,endx,endy;
int bfs()
{
    int i;
    while(!q.empty())
    {
        if(!flag)
        for(i=0;i<8;i++)
        {
            int tmpx,tmpy,tmpt;
            tmpx=q.front().x;tmpy=q.front().y;tmpt=q.front().t+1;
            tmpx+=go[i][0];tmpy+=go[i][1];
            if(tmpx<1||tmpx>n||tmpy<1||tmpy>n) continue;
            if(mark[tmpx][tmpy]) continue;
            if(tmpx==endx&&tmpy==endy) { flag=true;return tmpt;}
            node temp;temp.x=tmpx;temp.y=tmpy;temp.t=tmpt;
            mark[tmpx][tmpy]=1;
            q.push(temp);
        //    printf("%d %d %d\n",tmpx,tmpy,tmpt);
        }
        q.pop();
    }
    return -1;
}
int main()
{      //freopen("in.txt","r",stdin);
       int i,j ;
    while(~scanf("%d",&n) )
    {
        while(!q.empty()) q.pop();
        memset(mark,0,sizeof mark);
         flag=false;
        scanf("%d %d %d %d",&sx,&sy,&endx,&endy);
        if(sx==endx&&sy==endy)
        {
            printf("0\n");
            continue;
        }
        node temp;temp.x=sx;temp.y=sy;temp.t=0;
        mark[sx][sy]=1;
        q.push(temp);
        printf("%d\n",bfs());
        
    }
    return 0;
}

 

posted on 2013-02-24 11:28  huashiyiqike  阅读(257)  评论(1编辑  收藏  举报