ZOJ1056 The Worm Turns
The worm successfully made all 18 moves.
The worm ran into itself on move 9.
The worm ran off the board on move 21.
The worm successfully made all 13 moves.
題意:整個遊戲棋盤是50*50大小的,左上角在(1,1),貪吃蛇由20個節點組成,頭部位置在(25,30),水平延展到(25,11),可以有四個運動方向:東,西,南,北。題目就是給你一個運動序列,判斷最終結果是下面3種情況的哪一種:1)正常。2)頭撞到自己身體。3)出界。
解題思路:
主要思路:用陣列body記錄貪吃蛇的身體的座標,並在地圖上標記1
執行一次向上(N)移動後,body陣列尾部、頭部調整
函式int judge(int n,int m)判斷貪吃蛇出現以下哪種情況(n,m表示方向)
1)正常。 return 1;
2)頭撞到自己身體。 return -1;
3)出界 return 0;
函式int go(string s)模擬貪吃蛇行走
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
//用陣列body記錄貪吃蛇的身體,
int n,map[51][51],step,body[21][2];
int end = 0; //記錄body陣列蛇尾下標
int judge(int n,int m) { //判斷貪吃蛇出現哪種情況 n,m表示行走方向
if(m==0){
if(n> 0) {
if(body[(end+19)%20][0]-1<1)return 0;
if(map[body[(end+19)%20][0]- 1][body[(end+19)%20][1]]==1) return -1;
}else {
if(body[(end+19)%20][0]+1>50)return 0;
if(map[body[(end+19)%20][0]+1][body[(end+19)%20][1]]==1)return -1;
}
}else {
if(m> 0) {
if(body[(end+19)%20][1]- 1<1) return 0;
if(map[body[(end+19)%20][0]][body[(end+19)%20][1]-1]==1)return -1;
}else {
if(body[(end+19)%20][1]+1>50)return 0;
if(map[body[(end+19)%20][0]][body[(end+19)%20][1]+1]==1)return -1;
}
}
return1;
}
int go(string s) {
for(inti=0; i<20; i++) { //初始化貪吃蛇位置座標
body[i][0]= 25;
body[i][1]= i+11;
}
for(inti=0; i<n; i++) {
if(s[i]=='N'){
map[body[end][0]][body[end][1]]= 0;
if(judge(1,0)>0){//“正常”繼續走
intstart = (end+19)%20;
map[body[start][0]-1][body[start][1]]= 1;
body[end][0]= body[start][0] - 1;
body[end][1]= body[start][1];
end= (end+1)%20;
step++;
}else return judge(1,0);//撞牆或吃到自己直接返回引數判斷輸出
}else if(s[i] == 'S') {//下面三個方向參考“N”方向註釋
map[body[end][0]][body[end][1]]= 0;
if(judge(-1,0)>0){
intstart = (end+19)%20;
map[body[start][0]+1][body[start][1]]= 1;
body[end][0]= body[start][0]+1;
body[end][1]= body[start][1];
end= (end+1)%20;
step++;
}else return judge(-1,0);
}else if(s[i] == 'W') {
map[body[end][0]][body[end][1]]= 0;
if(judge(0,1)>0){
intstart = (end+19)%20;
map[body[start][0]][body[start][1]- 1] = 1;
body[end][0]= body[start][0];
body[end][1]= body[start][1] - 1;
end= (end+1)%20;
step++;
}else return judge(0,1);
}else if(s[i] == 'E') {
map[body[end][0]][body[end][1]]= 0;
if(judge(0,-1)>0){
intstart = (end+19)%20;
map[body[start][0]][body[start][1]+1]= 1;
body[end][0]= body[start][0];
body[end][1]= body[start][1] + 1;
end= (end+1)%20;
step++;
}else return judge(0,-1);
}
}
return1;
}
int main() {
strings;
while(cin>> n,n) {
cin>> s;
step= 0,end = 0; //用end標記貪吃蛇尾部,並將步數step和end初始化0
memset(map,0,sizeof(map));//初始化地圖0
for(inti=11; i<=30; i++)
map[25][i]= 1; //將貪吃蛇身體位置在地圖中標記1
intans = go(s);//ans用於儲存返回引數作為以下判斷依據
if(ans>0)printf("The worm successfully made all %d moves.\n",n);
elseif(ans<0) printf("The worm ran into itself on move %d.\n",step+1);
elseprintf("The worm ran off the board on move %d.\n",step+1);
}
return0;
}