一道C语言编程题目,想了好久了,老是WA,请大家帮忙看看

笑颜铁塔 2021-04-11 08:27:03
有一种工业零件,分成左右两半,它们的形状由’X’和空格表示的二维图形表示,比如:左半的零件形状如下:
XXXXX
XXX
XXXX
XXX
右半的零件的形状如下
XXX
XXXX
XXXX
XXXXX
所有的左半边的零件的左边第一列都是X,所有右半的零件的右边第一列都是X。
把这样的左右两个零件紧密地拼在一起,则可能存在空洞。零件本身也可能有空洞,但不会存在断裂的零件,每个空洞为一个空格,要求你写一个程序求出空洞的大小(空格的数目)。
第一行是一个整数K,表示有多少个测试用例,以后每一个测试用例占2n+1行。每个测试用例的第一行为一个整数n,(1<=n<=20),从第2行到n+1行为左半零件的二维图形,从第n+2行到2n+1行为右半零件。左半零件左对齐,最长一行不超过25列,
右半零件右对齐,最长一行不超过25列

输出:

每行输出一个测试用例的结果。


Sample Input
2
4
XXXXX
XXX
XXXX
XXX
XXX
XXXX
XXXX
XXXXX
2
XXXXX
X
XXXXX
XXX

Sample Output
1
6
我写的代码:
#include<stdio.h>
#include<string.h>
char s[1001];
int main()
{
int k,n,i,j,sta=0;
int sum=0;
int max1[100];
int max2[100];
int max;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
getchar();
sum=0;
for(i=0;i<n;i++)
{
gets(s);
for(j=0;s[j]!='\0';j++)
{ if(s[j]==' ')
{
sta++;//统计左边零件本身的空格
}
}
sum=sum+strlen(s);
max1[i]=strlen(s);
}
for(i=0;i<n;i++)
{
gets(s);
for(j=0;s[j]!='X';j++)
{
;
}
int temp=j;
for(;s[j]!='\0';j++)
{ if(s[j]==' ')
{
sta++;//统计右边零件本身的空格
}

}
sum=sum+j-temp;//j-temp为右边零件长度
max2[i]=j-temp;
}
max=0;
for(i=0;i<n;i++)//求出平凑出来的最长的一行的值
if((max1[i]+max2[i])>max)
max=max1[i]+max2[i];
sum=n*max-sum;
printf("%d\n",sum+sta);
}
return 0;
}
...全文
252 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 2021-04-18
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
虽然你结帖了,#1的代码实际是错的~
相当错 那天急着吃饭就走了 今天才又看到
笑颜铁塔 2021-04-14
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争的回复:
虽然你结帖了,#1的代码实际是错的~
哦哦,不过我没怎么看,我ac了就结帖了,还是很谢谢哦
  • 打赏
  • 举报
回复
虽然你结帖了,#1的代码实际是错的~
forever74 2021-04-12
  • 打赏
  • 举报
回复
供参考:

#include <stdio.h>
int main()
{
	int ncase, nline, maxx, sumx;
	int line[20];
	scanf("%d", &ncase);
	while (ncase--)
	{
		int i;
		maxx = 0;
		sumx = 0;
		for (i = 0; i < 20; i++)line[i] = 0;
		scanf("%d", &nline);
		while (getchar() != '\n');
		i = 0;
		while (i < 2*nline)
		{
			switch (getchar())
			{
			case 'X':
				line[i%nline]++;
				break;
			case '\n':
				i++;
			}
		}
		for (i = 0; i < nline; i++)
		{
			sumx += line[i];
			if (line[i] > maxx)maxx = line[i];
		}
		printf("%d\n", maxx*nline - sumx);
	}
	return 0;
}
笑颜铁塔 2021-04-12
  • 打赏
  • 举报
回复
我知道了,第一次发帖,谢谢你们的帮助
qzjhjxj 2021-04-12
  • 打赏
  • 举报
回复
引用 3 楼 因为天气好 的回复:
嗯嗯,但是我还是不知道自己的代码错哪了,样例可以过
楼主的代码,问题出在进入第二轮测试时,第一轮的统计的 max1[100] max2[100] sum sat这些值都没有复位归零。供参考:
#include<stdio.h>
#include<string.h>
char s[1001];
int main()
{
    int k,n,i,j,sta=0;
    int sum=0;
    int max1[100];
    int max2[100];
    int max;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d",&n);
        getchar();

        sum=0;sta=0;    //这些值需要复位归零
        for(i=0;i<100;i++){max1[i]=0;max2[i]=0;}

        for(i=0;i<n;i++)
        {
            gets(s);
            for(j=0;s[j]!='\0';j++)
            {   if(s[j]==' ')
                {
                    sta++;//统计左边零件本身的空格
                }
            }
            sum=sum+strlen(s);
            max1[i]=strlen(s);
        }
        for(i=0;i<n;i++)
        {
            gets(s);
            for(j=0;s[j]!='X';j++)
            {
                ;
            }
            int temp=j;
                for(;s[j]!='\0';j++)
            {   if(s[j]==' ')
                {
                    sta++;//统计右边零件本身的空格
                }
                
            }
            sum=sum+j-temp;//j-temp为右边零件长度
            max2[i]=j-temp;
        }
        max=0;
        for(i=0;i<n;i++)//求出平凑出来的最长的一行的值
            if((max1[i]+max2[i])>max)
                max=max1[i]+max2[i];
        sum=n*max-sum;
        printf("%d\n",sum+sta);
    }
    
    return 0;
}
笑颜铁塔 2021-04-12
  • 打赏
  • 举报
回复
嗯嗯,但是我还是不知道自己的代码错哪了,样例可以过
  • 打赏
  • 举报
回复
把这样的左右两个零件紧密地拼在一起!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧