贪吃蛇
Time Limit:1000MS Memory Limit:65536KB
Total Submit:480 Accepted:109
Description
相信很多人都玩过这个游戏,当然这个题目不是叫你写一个贪吃蛇游戏,而是很简单的模拟而已,为了简化规则,我们把游戏抽象为:
在H×W的格点上有一条小小的长度为1的蛇,这条蛇每次只能向上下左右四个方向移动一个单位距离。在某些格点上有营养价值不同的蘑菇,当蛇移动到含有蘑菇的点的时候,其生命力会增加相应的值。在每个时间点,其选择的方向是由函数Fn % 4决定的,其中F0 = 0,F1 = 1,Fn = Fn - 1 + Fn – 2 。如果蛇选择的方向会立即撞到墙,它会沿着该方向的顺时针选择第一个不会撞到墙的方向作为该时刻的方向。初始时刻是0时刻,蛇在左上角,初始生命力为0,某个点上的蘑菇在吃掉后会立刻长出来。最外一圈是墙,没有给出来。
请你输出T时刻蛇的生命力。方向对应关系为:上(0)、右(1)、下(2)、左(3).
Input
每个文件一个测试数据:
数据的第一行三个整数H,W,T 。( 2 <= H、W<=100 ,0<=T<=1000 )
接下来H行,每行W个字符,其中‘.’表示可行走的空地,‘0’-‘9’表示价值不同的蘑菇,相应的价值分别为0-9
Output
对于每组数据,输出一个值,表示T时刻后(含T时刻)蛇的生命力
Sample Input
2 3 4
145
1..
Sample Output
10
Hint:
0时刻蛇在(0,0) , 方向0,但是会出界,顺时针选择第一个不出界的方向1,生命力1
1时刻蛇在(0,1) , 方向1,生命力5
2时刻蛇在(0,2), 方向1,会出界,选择方向2,生命力10
3时刻蛇在(1,2), 方向2,会出界,选择方向3,生命力10
4时刻蛇在(1,1), 方向3,生命力10
(请多体会这个"方向"的含义)
Source
解题:我就不吐槽这题,题意真尼玛晦涩难懂
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 110; 4 char table[maxn][maxn]; 5 int H,W,T,f[1001] = {0,1}; 6 const int dir[4][2] = {-1,0,0,1,1,0,0,-1}; 7 bool isIn(int x,int y){ 8 return x < H && x >= 0 && y >= 0 && y < W; 9 } 10 int solve(){ 11 int life = isdigit(table[0][0])?table[0][0] - ‘0‘:0,nowdir = 0,time = 0; 12 int x = 0,y = 0; 13 while(time < T){ 14 int nx = x + dir[nowdir = f[time]][0]; 15 int ny = y + dir[f[time]][1]; 16 while(!isIn(nx,ny)){ 17 nowdir++; 18 nx = x + dir[nowdir%4][0]; 19 ny = y + dir[nowdir%4][1]; 20 } 21 x = nx; 22 y = ny; 23 time++; 24 if(isdigit(table[x][y])) life += table[x][y] - ‘0‘; 25 } 26 return life; 27 } 28 int main(){ 29 for(int i = 2; i < 1001; ++i) 30 f[i] = (f[i-1] + f[i-2])%4; 31 while(~scanf("%d%d%d",&H,&W,&T)){ 32 for(int i = 0; i < H; ++i) 33 scanf("%s",table[i]); 34 printf("%d\n",solve()); 35 } 36 return 0; 37 }