过了一部分有WA,有TLE,代码理解请看注释。
#include <bits/stdc++.h>
using namespace std;
const int N=2010;
struct Node
{
int x,y;
}snack[N*N];
int cnt;//蛇的长度
int s[N][N];//蛇身在当前点的数值,如果为-1则不是蛇身
int ma[N][N];//食物点,不是食物点为-1,否则为非负数(>=0)
int m,p,n;
int w,k,c;
char op;
int main()
{
scanf("%d%d%d",&m,&p,&n);
memset (ma,-1,sizeof ma);
memset (s,-1,sizeof s);
while (p--)
{
scanf("%d%d%d",&w,&k,&c);
ma[w][k]=c;
}
//先把起始值记录下,横纵坐标为(1,1),数值为0
cnt++;
snack[cnt].x=1,snack[cnt].y=1;
s[1][1]=0;
while (n--)
{
scanf("%s",&op);
if (op=='Z')//询问
{
scanf("%d%d",&w,&k);
printf("%d\n",s[w][k]);
}
else
{
int x,y;//记录下一个点的横纵坐标
if (op=='G') x=snack[cnt].x-1,y=snack[cnt].y;
if (op=='D') x=snack[cnt].x+1,y=snack[cnt].y;
if (op=='L') x=snack[cnt].x,y=snack[cnt].y-1;
if (op=='P') x=snack[cnt].x,y=snack[cnt].y+1;
if (ma[x][y]!=-1)//如果是食物点,蛇的长度加1,横纵坐标为下一个点的横纵坐标,数值为食物点的数值
{
cnt++;
snack[cnt].x=x;
snack[cnt].y=y;
s[x][y]=ma[x][y];
ma[x][y]=-1;//删除食物点
}
else//不是食物点就要向前走
{
//先处理数值从头到尾
s[x][y]=s[snack[cnt].x][snack[cnt].y];//前进的点的数值变为原来蛇头节点的数值
for (int i=cnt;i>1;i--) s[snack[i].x][snack[i].y]=s[snack[i-1].x][snack[i-1].y];//下一个点的数值变为前一个点的数值
s[snack[1].x][snack[1].y]=-1;//原来的尾坐标数值为-1(即不是蛇身)
//再处理坐标从尾到头
for (int i=1;i<cnt;i++) snack[i].x=snack[i+1].x,snack[i].y=snack[i+1].y;//前一个点的坐标变为下一个点的坐标
snack[cnt].x=x,snack[cnt].y=y;
}
}
}
return 0;
}