简易连连看(本题的坑巨多!我帮大家总结一下)

题目

在这里插入图片描述

答案

#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;
		}
	}
} 

总结遇到的坑

  1. 在遇到输入字符的题目时,一定要注意对于空格、回车等字符的特殊处理,拿本题来说,每行都要分情况处理并在最后加一个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. 如题所说,注意格子的行、列编号是从1到2N,所以在输入坐标后,要将他们都减一,以此来和数组适配。代码如下:
	int x1,y1,x2,y2;
	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	x1--,y1--,x2--,y2--;
  1. 在判断是否连连看成功时,要注意,如果两个字符已经是*了,就还是要输出Uh-oh,而非进行后续的打印操作。代码如下:
	if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'&&a[x2][y2]!='*')
  1. 这里判断是否全部匹配成功,不需要每次都遍历数组判断是否都为*,只需创建一个count2变量用以记录匹配成功的次数,当匹配的次数与数组内总字符数量的一半相等时,就是全部匹配成功的时刻。(这个算是注意事项)

  2. 在打印第三次Uh-oh后,要马上输出Game Overbreak,而非将所有的‘*’打印出来。所以这个地方要注意判断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");
		}
	}

最后

当你绕过上述的所有坑后,恭喜你!你已经能顺利通过测验了。

既然都看到这了,大家能不能为这篇文章点上一个宝贵的赞呢?十分感谢大家!

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值