NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2006國中組初賽
 NPSC 2006 國中組 初賽 B.貪食蛇

作者 主題: NPSC 2006 國中組 初賽 B.貪食蛇  (閱讀 1828 次)

sagit

  • 管理員
  • 白金會員
  • *****
  • 文章數: 225
    • 檢視個人資料
NPSC 2006 國中組 初賽 B.貪食蛇
« 於: 十二月 14, 2011, 02:05:24 pm »

解題方向:稍微有點麻煩的模擬題,用陣列把蛇的每一格座標、食物座標、指令以及要印出畫面的時間記錄起來,然後用迴圈一秒一秒計算它的變化即可,要注意的是吃到食物是下一秒才會增長。另外,蛇的每一格座標可以用環狀佇列來記錄,這樣就不用一直複製它們的座標到下一格。

代碼: [選擇]
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int X[1000], Y[1000], Fx[400], Fy[400], Kd[10000], Kt[10000], T[1000],
        head, tail, x, y, food, key, time, run, score, t, eat, dir, m, n, k, i;
    string s;
    while (1)
    {
        cin >> m >> n >> k;
        if (m==0&&n==0&&k==0) break;
        for (i=0; i<m; i++) cin >> Fx[i] >> Fy[i]; // 輸入食物座標
        for (i=0; i<n; i++) // 輸入指令
        {
            cin >> s >> Kt[i];
            switch (s[0])
            {
                case 'r':
                    Kd[i]=0;
                    break;
                case 'u':
                    Kd[i]=1;
                    break;
                case 'l':
                    Kd[i]=2;
                    break;
                case 'd':
                    Kd[i]=3;
                    break;
            }
        }
        for (i=0; i<k; i++) cin >> T[i]; // 輸入時間
        for (i=0, head=4, tail=0; i<5; i++) X[i]=i+1, Y[i]=10;
        // 開始執行
        for (t=0, run=1, score=0, food=0, key=0, time=0, dir=0, eat=0; run; t++)
        {
            if (time<k&&T[time]==t) // 印出畫面的時間
            {
                cout << (1001+head-tail)%1000 << " " << score << " (" << X[head] << ","
                     << Y[head] << ") (" << X[tail] << "," << Y[tail] << ")"
                     << endl;
                time++;
            }
            if (key<n&&Kt[key]==t) // 輸入指令的時間
            {
                if( (Kd[key]+dir)%2==1 ) dir=Kd[key];
                key++;
            }
            // 計算下一格座標
            switch(dir) // 判斷方向
            {
                case 0: // right
                    x=X[head]+1;
                    y=Y[head];
                    if (x>40) run=0;
                    break;
                case 1: // up
                    x=X[head];
                    y=Y[head]+1;
                    if (y>20) run=0;
                    break;
                case 2: // left
                    x=X[head]-1;
                    y=Y[head];
                    if (x<1) run=0;
                    break;
                case 3: // down
                    x=X[head];
                    y=Y[head]-1;
                    if (y<1) run=0;
                    break;
            }
            for (i=tail; i!=head; i=(i+1)%1000) // 判斷碰到自己身體
            {
                if (X[i]==x&&Y[i]==y)
                {
                    run=0;
                    break;
                }
            }
            if (run==0) break; // 結束遊戲
            // 移動座標
            head=(head+1)%1000;
            X[head]=x, Y[head]=y;
            if (eat) eat=0;
            else tail=(tail+1)%1000;
            if (food<m&&Fx[food]==x&&Fy[food]==y) // 吃到食物
            {
                score+=10;
                eat=1;
                food++;
            }
        }
        cout << t+1 << " " << (1001+head-tail)%1000 << " " << score << endl << endl;
    }
    system("PAUSE");
    return 0;
}
記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2006國中組初賽
 NPSC 2006 國中組 初賽 B.貪食蛇