NOIP提高组 Brothers

来源:互联网 发布:淘宝能买到迷彩awp 编辑:程序博客网 时间:2024/05/08 20:01

Description

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

例如,如果有3个王子,那么战斗过程如下所示:

这里写图片描述

Data Constraint

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

Solution

考虑到2<=R,C<=100,1<=K<=100,直接模拟一下过程就好了。总时间复杂度为O(R* C*K)。

代码

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=105;const int f[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int a[2][maxn][maxn],q,n,m,p,i,t,j,k,l,x,y;int pan(int x){    if (x!=q-1) return x+1;return 0;}int main(){//  freopen("data.in","r",stdin);    scanf("%d%d%d%d",&q,&n,&m,&p);    for (i=1;i<=n;i++)          for (j=1;j<=m;j++)            scanf("%d",&a[0][i][j]);    for (l=1;l<=p;l++){        t=l%2;        for (i=1;i<=n;i++)            for (j=1;j<=m;j++)                a[t][i][j]=a[1-t][i][j];        for (i=1;i<=n;i++)            for (j=1;j<=m;j++)                for (k=0;k<=3;k++){                    x=i+f[k][0];y=j+f[k][1];                    if (x<1 || y<1 || x>n || y>m) continue;                    if (a[1-t][x][y]==pan(a[1-t][i][j])) a[t][x][y]=a[1-t][i][j];                }    }    for (i=1;i<=n;i++){        for (j=1;j<=m;j++)            printf("%d ",a[t][i][j]);        printf("\n");    }}
3 0
原创粉丝点击