UVa 414 - Machined Surfaces

本文介绍了一种通过记录字符串中特定字符的位置并进行平移计算空位数量的方法,并提供了两种不同的实现思路及其代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:有n行字符串,每行中间是空格,两边是字母X,把右边的整体往左边平移,直到某一行中间没有空格就计算此时整个平面里的空格数。

首先想到的思路就是:利用两个数组left,right分别记录每一行左边x的终结位置和右边X的开始位置,然后利用right[i]的递减来模拟左移,最终由right[i],left[i]的差值来判断某一行是否已满,最后再把差值的和打印出来就得到结果。有个特殊情况,就是中间没空格的,全是XXXXX,这个要特殊对待。

Sample Input

4
XXXX                XXXXX
XXX               XXXXXXX
XXXXX                XXXX
XX                 XXXXXX
2
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
1
XXXXXXXXX              XX
0

代码如下:

#include<stdio.h>
#include<string.h>
#define MAXN 100
#define TRUE 1
#define FALSE 0

int left[MAXN];
int right[MAXN];

int main()
{
	//freopen("C:\\in.txt","r",stdin);	
		
	int n,i,j,sum;
	int leftFlag,okFlag;
	char c;	
	while(scanf("%d",&n) && n != 0)
	{
		memset(left,0,sizeof(left));  
		memset(right,0,sizeof(right));		
		sum = 0;
		okFlag = FALSE;
		for(i=0; i<n; i++)
		{
			getchar();    //clear '\n' 
			leftFlag = FALSE;						 
			for(j=0; j<25; j++)
			{				
				if((c=getchar()) == ' ' && leftFlag == FALSE)
				{
					left[i] = j-1;
					leftFlag = TRUE;
				}
				if(leftFlag == TRUE && c == 'X')
				{
					right[i] = j;
					leftFlag = FALSE;
				}					
			}			
		}
		
		for(i=0; i<n; i++)			//特殊情况判断 
			if(right[i] == 0)
			{
				okFlag = TRUE;
				break;
			}		
				
					
		while(!okFlag)
		{			
			for(i=0; i<n; i++)
			{
				right[i]--;
				if(right[i] == left[i]+1)
					okFlag = TRUE;
			}
		}
		
		for(i=0; i<n; i++)
		{
			if(right[i] == 0)
				continue;
			else
				sum += right[i] - left[i] - 1;
		}
		printf("%d\n",sum);
		getchar();		//clear '\n' 
	}
	return 0;
}




另外在网上看到一种比较好的思路:

不管中间的过程如何,直接对平移结束之后的情况考虑,有一行中间没有空格了,那么每一行中间的空格数就等于满了的这一行的所有X与其他行的x之差
试着写了下,比之前那个要好写的多
代码如下:
#include <stdio.h>
#include <string.h>
#define MAXN 100
int main()
{
	freopen("C:\\in.txt","r",stdin);
	int n,max,len,i,j,sum;
	int count[MAXN];
	char c;
	while(scanf("%d",&n) && n != 0 )
	{		
		memset(count,0,sizeof(count));
		sum = max = 0;
		for(i=0; i<n; i++)
		{
			c = getchar();			//clear '\n' ,加个c方便调试 
			len = 0;
			for(j=0; j<25; j++)		
				if((c=getchar()) == 'X')
					len++;
			count[i] = len;
			if(len > count[max])
				max = i; //记下最大数在数组中的位置 			
		}
		for(i=0; i<n; i++)		
			sum += count[max] - count[i];
		
		printf("%d\n",sum);		
		c = getchar();			//clear '\n'
	}	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值