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