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;
}
相关推荐
Q741_147几秒前
C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
c++·算法·leetcode·双指针·滑动窗口
草莓熊Lotso1 分钟前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day8
c语言·开发语言·c++·刷题·强化训练
Fine姐10 分钟前
数据挖掘3.6~3.10 支持向量机—— 核化SVM
算法·支持向量机·数据挖掘
野渡拾光2 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
tainshuai4 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.8249 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao3410 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng113310 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类