oj 1.8编程基础之多维数组 16:矩阵剪刀石头布

题目:


Bart的妹妹Lisa在一个二维矩阵上创造了新的文明。矩阵上每个位置被三种生命形式之一占据:石头,剪刀,布。每天,上下左右相邻的不同生命形式将会发生战斗。在战斗中,石头永远胜剪刀,剪刀永远胜布,布永远胜石头。每一天结束之后,败者的领地将被胜者占领。

你的工作是计算出n天之后矩阵的占据情况。

输入

第一行包含三个正整数r,c,n,分别表示矩阵的行数、列数以及天数。每个整数均不超过100。

接下来r行,每行c个字符,描述矩阵初始时被占据的情况。每个位置上的字符只能是R,S,P三者之一,分别代表石头,剪刀,布。相邻字符之间无空格。

输出

输出n天之后的矩阵占据情况。每个位置上的字符只能是R,S,P三者之一,相邻字符之间无空格。

样例输入

复制代码
3 3 1
RRR
RSR
RRR

样例输出

复制代码
RRR
RRR
RRR

测试数据

3 3 2

RRS

PSR

PRR

wrong answer

3 3 2

RRS

PSR

PRR

every day answer is

PRR

SRR

PPR

every day answer is

PPR

SRR

PPR

通过这个数据我发现每一天过后,我要把tmp中的数据再次复制到arr中

下面是一个找错的代码,我去观察了每一天运行后的结果

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//代表:r石头,p布,s剪刀
int fightjudge(char ch1,char ch2)
{
    int flag;
    if(ch1=='R')
    {
        if(ch2=='R')
            flag=0;
        else if(ch2=='P')
            flag=-1;
        else
            flag=1;
    }
    else if(ch1=='P')
    {
         if(ch2=='P')
            flag=0;
        else if(ch2=='S')
            flag=-1;
        else
            flag=1;
    }
    else
    {
        if(ch2=='S')
            flag=0;
        else if(ch2=='R')
            flag=-1;
        else
            flag=1;
    }
    return flag;
}


void fight(char a[101][101],char tmp[101][101],int i,int j,int line,int row)
{
   if(i-1>=0)
   {
       if(fightjudge(a[i][j],a[i-1][j])==1)
       {
           tmp[i-1][j]=a[i][j];


       }
   }

       if(i+1<line)
       {
            if(fightjudge(a[i][j],a[i+1][j])==1)
           {
               tmp[i+1][j]=a[i][j];

           }
       }

       if(j-1>=0)
       {
            if(fightjudge(a[i][j],a[i][j-1])==1)
           {
               tmp[i][j-1]=a[i][j];

           }
       }

       if(j+1<row)
       {
                if(fightjudge(a[i][j],a[i][j+1])==1)
           {
               tmp[i][j+1]=a[i][j];

           }
       }


}

void copyit(char arr[101][101],char tmp[101][101],int line,int row)
{//哇塞,这里的arr中的大小要一直保持一致
    int i,j;
    printf("in the sub function tmp is \n");
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {


            printf("%c",tmp[i][j]);

        }
        printf("\n");


    }//这个是来看子函数里面的tmp是否出错

    printf("in the sub function arr is \n");
     for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {

            arr[i][j]=tmp[i][j];
            printf("%c",arr[i][j]);

        }
        printf("\n");


    }//这里是看子函数里面的arr是否正确

}




int main()
{
    int line,row;
    scanf("%d %d",&line,&row);
    int days;
    scanf("%d",&days);

    char arr[101][101],tmp[101][101];

    int i,j;

     for(i=0;i<line;i++)
    {  getchar();
        for(j=0;j<row;j++)
        {
            scanf("%c",&arr[i][j]);
            tmp[i][j]=arr[i][j];

        }


    }


    int n;

    for(n=0;n<days;n++)
    {
            for(i=0;i<line;i++)
            {
                for(j=0;j<row;j++)
                {
                     fight(arr,tmp,i,j,line,row);

                }

            }

            copyit(arr,tmp,line,row);

     printf("every day answer about arr is\n");
            for(i=0;i<line;i++)
            {
                for(j=0;j<row;j++)
                {
                    printf("%c",arr[i][j]);
                }
                printf("\n");
            }//单步查看,看一下那里会出错

     printf("every day answer about tmp is\n");
            for(i=0;i<line;i++)
            {
                for(j=0;j<row;j++)
                {
                    printf("%c",tmp[i][j]);
                }
                printf("\n");
            }


    }
      return 0;
}

最终的代码

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//代表:r石头,p布,s剪刀
int fightjudge(char ch1,char ch2)
{
    int flag;
    if(ch1=='R')
    {
        if(ch2=='R')
            flag=0;
        else if(ch2=='P')
            flag=-1;
        else
            flag=1;
    }
    else if(ch1=='P')
    {
         if(ch2=='P')
            flag=0;
        else if(ch2=='S')
            flag=-1;
        else
            flag=1;
    }
    else
    {
        if(ch2=='S')
            flag=0;
        else if(ch2=='R')
            flag=-1;
        else
            flag=1;
    }
    return flag;
}


void fight(char a[101][101],char tmp[101][101],int i,int j,int line,int row)
{
   if(i-1>=0)
   {
       if(fightjudge(a[i][j],a[i-1][j])==1)
       {
           tmp[i-1][j]=a[i][j];


       }
   }

       if(i+1<line)
       {
            if(fightjudge(a[i][j],a[i+1][j])==1)
           {
               tmp[i+1][j]=a[i][j];

           }
       }

       if(j-1>=0)
       {
            if(fightjudge(a[i][j],a[i][j-1])==1)
           {
               tmp[i][j-1]=a[i][j];

           }
       }

       if(j+1<row)
       {
                if(fightjudge(a[i][j],a[i][j+1])==1)
           {
               tmp[i][j+1]=a[i][j];

           }
       }


}

void copyit(char arr[101][101],char tmp[101][101],int line,int row)
{//哇塞,这里的arr中的大小要一直保持一致
    int i,j;



     for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {

            arr[i][j]=tmp[i][j];

        }



    }

}




int main()
{
    int line,row;
    scanf("%d %d",&line,&row);
    int days;
    scanf("%d",&days);

    char arr[101][101],tmp[101][101];

    int i,j;

     for(i=0;i<line;i++)
    {  getchar();
        for(j=0;j<row;j++)
        {
            scanf("%c",&arr[i][j]);
            tmp[i][j]=arr[i][j];

        }


    }


    int n;

    for(n=0;n<days;n++)
    {
            for(i=0;i<line;i++)
            {
                for(j=0;j<row;j++)
                {
                     fight(arr,tmp,i,j,line,row);

                }

            }

            copyit(arr,tmp,line,row);



    }
    for(i=0;i<line;i++)
        {
            for(j=0;j<row;j++)
            {
                printf("%c",tmp[i][j]);
            }
            printf("\n");
        }

      return 0;
}
相关推荐
让我们一起加油好吗18 分钟前
【C++】封装红黑树模拟实现 set 和 map
linux·c++·set·map·红黑树
Mr.Ja21 分钟前
【LeetCode热题100】No.11——盛最多水的容器
算法·leetcode·贪心算法·盛水最多的容器
hsjkdhs24 分钟前
C++之类的继承与派生
开发语言·c++
冷徹 .33 分钟前
2024ICPC区域赛香港站
数据结构·c++·算法
沐怡旸1 小时前
【底层机制】std:: function 解决的痛点?是什么?如何实现?如何正确用?
c++·面试
浅川.251 小时前
xtuoj string
开发语言·c++·算法
韧竹、1 小时前
数据结构之顺序表
c语言·数据结构
韩非1 小时前
if 语句对程序性能的影响
算法·架构
用户916357440951 小时前
LeetCode热题100——15.三数之和
javascript·算法
ting_zh2 小时前
导数、偏导数与梯度:机器学习数学基础
算法·基础数学