%求余划分区域的关键先生
  • %这个在我这种小白看来是只要题目不说就是完全不使用的运算,但一道题让我明白%的一个重要性
    https://www.luogu.com.cn/problem/AT_abc339_b
    在开始的时候我选择的做法是这样的
点击查看代码
int dir(int a)
{
	if(a==-1)
	{
		return 3;
	}
	else if(a==4)
	{
		return 0;
	}
	return a;
}
int bro(int x)
{
	if(x>H)
	{
		return x-H;
	}
	else if(x<1)
	{
		return H+x;
	}
	return x;
}
int bro2(int y)
{
	if(y>W)
	{
		return y-W;
	}
	else if(y<1)
	{
		return W+y;
	}
	return y;
}

我是用函数进行判断这样非常麻烦的方法,接下来要说的是一个不用这样就能完成这样操作的办法。

通过这张图,我们估计什么也想不到,不就是一个0~19这有什么特别的,但我加个条件说10的后面是1,1的前面是10。
这样就和上面的题的条件有点相像了,我假设0的下标是1,9的下标是10。那相应的10的下标就对应1。
0和10是什么关系,这就回到标题上了。0%10=0,10%10=0,1%10=1,11%10=1......看对应关系就明了了。
所以上面的题我们就可以不需要靠函数进行判断,我们只要使用%就可以。给个核心代码

点击查看代码
d=(d+5)%4;
xx=(xx+dirs[d][0]+H)%H;
yy=(yy+dirs[d][1]+W)%W;

当我想通这点的时候,我忽然想起这道题跟这个思路相似
https://www.luogu.com.cn/problem/B3696
就是看在[0,2022]的相对位置

点击查看代码
((x%2023)+2023)%2023
这里的多的%2023是为了防止单独加2023出现负数的情况
posted on 2024-02-04 14:40  咋瓦鲁多_食我压路机  阅读(0)  评论(0)    收藏  举报