题目
答案
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
getchar();
n=n*2; //将n乘2以方便后续的代码编写
char a[n][n];
int i,j,k;
for(i=0;i<n;i++)
{
scanf("%c",&a[i][0]);
for(j=1;j<n;j++)
scanf(" %c",&a[i][j]);
getchar();
}
int x,count1=0,count2=0;
scanf("%d",&x);
for(i=0;i<x;i++)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
x1--,y1--,x2--,y2--;
if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'&&a[x2][y2]!='*')
{
count2++;
if(count2==n*n/2)
{
printf("Congratulations!\n");
break;
}
a[x1][y1]='*';
a[x2][y2]='*';
for(j=0;j<n;j++)
{
printf("%c",a[j][0]);
for(k=1;k<n;k++)
{
printf(" %c",a[j][k]);
}
printf("\n");
}
}
else
{
printf("Uh-oh\n");
count1++;
}
if(count1==3)
{
printf("Game Over\n");
break;
}
}
}
总结遇到的坑
- 在遇到输入字符的题目时,一定要注意对于空格、回车等字符的特殊处理,拿本题来说,每行都要分情况处理并在最后加一个getchar();同时,在输入整数和输入字符之间也要加一个getchar()吸收回车。代码如下:
scanf("%d",&n);
getchar();
n=n*2;
char a[n][n];
int i,j,k;
for(i=0;i<n;i++)
{
scanf("%c",&a[i][0]);
for(j=1;j<n;j++)
scanf(" %c",&a[i][j]);
getchar();
}
- 如题所说,注意格子的行、列编号是从1到2N,所以在输入坐标后,要将他们都减一,以此来和数组适配。代码如下:
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
x1--,y1--,x2--,y2--;
- 在判断是否连连看成功时,要注意,如果两个字符已经是
*
了,就还是要输出Uh-oh
,而非进行后续的打印操作。代码如下:
if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'&&a[x2][y2]!='*')
-
这里判断是否全部匹配成功,不需要每次都遍历数组判断是否都为
*
,只需创建一个count2
变量用以记录匹配成功的次数,当匹配的次数与数组内总字符数量的一半相等时,就是全部匹配成功的时刻。(这个算是注意事项) -
在打印第三次
Uh-oh
后,要马上输出Game Over
并break
,而非将所有的‘*’打印出来。所以这个地方要注意判断count2
(匹配成功的次数)的位置.代码如下:
if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'&&a[x2][y2]!='*')
{
count2++;
if(count2==n*n/2)
{
printf("Congratulations!\n");
break;
}
a[x1][y1]='*';
a[x2][y2]='*';
for(j=0;j<n;j++)
{
printf("%c",a[j][0]);
for(k=1;k<n;k++)
{
printf(" %c",a[j][k]);
}
printf("\n");
}
}
最后
当你绕过上述的所有坑后,恭喜你!你已经能顺利通过测验了。
既然都看到这了,大家能不能为这篇文章点上一个宝贵的赞呢?十分感谢大家!