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;
}
相关推荐
想跑步的小弱鸡4 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
xyliiiiiL6 小时前
ZGC初步了解
java·jvm·算法
爱的叹息6 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
Merokes7 小时前
关于Gstreamer+MPP硬件加速推流问题:视频输入video0被占用
c++·音视频·rk3588
独好紫罗兰7 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
每次的天空7 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
请来次降维打击!!!8 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
qystca8 小时前
蓝桥云客 刷题统计
算法·模拟
别NULL8 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体
嘤国大力士9 小时前
C++11&QT复习 (七)
java·c++·qt