2021.8.13提高B组模拟5T1 Brothers(暴力)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.8.13提高B组模拟5T1 Brothers(暴力)相关的知识,希望对你有一定的参考价值。

Brothers

题目大意

在遥远的西方有一个古老的王国,国王将他的王国分成了网格状,每一块称之为一个城市。在国王临死前,他将这些城市分给了自己的N个儿子(编号为0到N-1)。然而这N个王子的关系不是很好,0讨厌1,1讨厌2,2讨厌3……N-1讨厌0。
在国王死后,这种不好的关系使得王子之间爆发了战争。战斗只会在相邻的两个城市之间爆发(共有一条边称之为相邻),并且只有当A讨厌B时,A才会对B发起战斗,结果必定是A获得这次战斗的胜利。当一方胜利后,他所进攻的城市就会变成进攻方的。许多战斗是同时发生的,我们称之为一场战役。当多场战役发生之后,剩下的王子将不再发生战争。
例如,如果有3个王子,那么战斗过程如下所示:

输入样例

第一行输入4个数,N,R,C,K。有N个王子,王国分为R*C的网格图。询问K场战役之后的城市归属图。
下面R行,每行C个数字,表示一开始城市的归属。

1.

3 4 4 3
0 1 2 0
1 0 2 0
0 1 2 0
0 1 2 2

2.

4 2 3 4
1 0 3
2 1 2

3.

8 4 2 1
0 7
1 6
2 5
3 4

输出样例

R行C列,表示K场战役之后的城市归属图。

1.

2 2 2 0
2 1 0 1
2 2 2 0
0 2 0 0

2.

1 0 3
2 1 2

3.

7 6
0 5
1 4
2 3

题目数据

2<=N<=100
2<=R,C<=100
1<=K<=100
保证数据合法

解题思路

就是暴力,记得存储转移

AC代码

#include<cstdio>
using namespace std;
int n,r,c,K,a[105][105],b[105][105];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool check(int x,int y)
{
	if(x>=1&&x<=r&&y>=1&&y<=c)return true;
	return false;
}
int main()
{
	scanf("%d%d%d%d",&n,&r,&c,&K);
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			scanf("%d",&a[i][j]);
	for(int k=1;k<=K;k++)
	{
		for(int i=1;i<=r;i++)//赋值
			for(int j=1;j<=c;j++)
				b[i][j]=a[i][j];
		for(int i=1;i<=r;i++)//暴力
			for(int j=1;j<=c;j++)
				for(int xx=0;xx<4;xx++)
				{
					int x=dx[xx]+i,y=dy[xx]+j;
					if(check(x,y))
						if((a[i][j]+1)%n==a[x][y])
							b[x][y]=a[i][j];
				}
		for(int i=1;i<=r;i++)//赋值
			for(int j=1;j<=c;j++)
				a[i][j]=b[i][j];
	}
	for(int i=1;i<=r;i++,printf("\\n"))
		for(int j=1;j<=c;j++)	
			printf("%d ",a[i][j]);
	return 0;
}

谢谢

以上是关于2021.8.13提高B组模拟5T1 Brothers(暴力)的主要内容,如果未能解决你的问题,请参考以下文章

2021.7.16提高B组模拟5T1 并行博弈(博弈论)

2021.8.13提高B组模拟5T3 Word (暴力)

2021.8.13提高B组模拟5T2 Crisis(小根堆)

2021.8.13提高B组模拟5T3 Word (暴力)

2021.8.13提高B组模拟5T2 Crisis(小根堆)

2017.12.09NOIP提高组模拟赛A组