题目:
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;
}