程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4452 Running Rabbits 模擬,hdu4452

HDU 4452 Running Rabbits 模擬,hdu4452

編輯:C++入門知識

HDU 4452 Running Rabbits 模擬,hdu4452


大致題意不難理解,注意幾點細節。

轉向觸發條件:

⑴ 一個小時走完後向左轉;

⑵ 碰到牆向後轉;

⑶ 兩只兔子都走完一個小時的路後(即當時間K為整數時),如果相遇,就交換方向,並且不再向左轉。(之前一直以為走的過程中相遇也可以交換方向,一直wa)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int dx[]= {0,-1,0,1}; //方向順序為N,W,S,E。這是為了方便向左轉
int dy[]= {-1,0,1,0};
int n;
int time;

struct Coo
{
    int x;
    int y;
} coo[2];
struct Rabbit
{
    int di;
    int v;
    int turn;
} rabbit[2];

void solve()
{
    coo[0].x=coo[0].y=1;
    coo[1].x=coo[1].y=n;
    for(int i=1; i<=time; i++)
    {
        bool flag1=true;
        for(int j=0; j<rabbit[0].v; j++) //一步一步走,不能往前走轉向
        {
            int x=coo[0].x;
            int y=coo[0].y;
            int di=rabbit[0].di;
            if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
                rabbit[0].di=di=(di+2)%4; //向後轉
            coo[0].x=x+dx[di];
            coo[0].y=y+dy[di];
        }
        for(int j=0; j<rabbit[1].v; j++)
        {
            int x=coo[1].x;
            int y=coo[1].y;
            int di=rabbit[1].di;
            if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
                rabbit[1].di=di=(di+2)%4;
            coo[1].x=x+dx[di];
            coo[1].y=y+dy[di];
        }
        if(coo[0].x==coo[1].x && coo[0].y==coo[1].y)
        {
            int direct;
            direct=rabbit[0].di;
            rabbit[0].di=rabbit[1].di;
            rabbit[1].di=direct;
            flag1=false;
        }
        if(i%rabbit[0].turn==0 && flag1)
            rabbit[0].di=(rabbit[0].di+1)%4; //向左轉
        if(i%rabbit[1].turn==0 && flag1)
            rabbit[1].di=(rabbit[1].di+1)%4;
    }
    printf("%d %d\n%d %d\n",coo[0].y,coo[0].x,coo[1].y,coo[1].x);
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n),n)
    {
        for(int i=0; i<2; i++)
        {
            char c;
            getchar();
            scanf("%c%d%d",&c,&rabbit[i].v,&rabbit[i].turn);
            if(c=='N')rabbit[i].di=0;       //將方向轉化為數字,向左轉的話+1再模4,向後轉+2再模4
            else if(c=='W')rabbit[i].di=1;
            else if(c=='S')rabbit[i].di=2;
            else if(c=='E')rabbit[i].di=3;
        }
        scanf("%d",&time);
        solve();
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved