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 48
算法·leetcode·职场和发展
mmz12079 分钟前
深度优先搜索DFS2(c++)
c++·算法·深度优先
6Hzlia9 分钟前
【Hot 100 刷题计划】 LeetCode 169. 多数元素 | C++ 哈希表基础解法
c++·leetcode·散列表
米粒111 分钟前
力扣算法刷题 Day 38 (打家劫舍专题)
算法·leetcode·职场和发展
暴力求解12 分钟前
C++ ---string类(三)
开发语言·c++
Robot_Nav16 分钟前
RC-ESDF与Lazy Theta* 算法结合进行离线全局路径的生成
算法·全局规划·esdf
papership17 分钟前
【入门级-算法-7、搜索算法:深度优先搜索】
算法·深度优先
itman30126 分钟前
C语言入门:掌握编程底层逻辑与核心技能
c语言·编程入门·系统开发·底层逻辑·核心技能
山甫aa31 分钟前
哈希集合-----从零开始的数据结构学习
数据结构·算法·哈希算法
say_fall33 分钟前
有关算法的简单数学问题
数据结构·c++·算法·职场和发展·蓝桥杯