0pt求助!!!
查看原帖
0pt求助!!!
784944
huozhenyi楼主2023/11/16 09:12

过了一部分有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;
}
2023/11/16 09:12
加载中...