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