题目大意:有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; }
另外在网上看到一种比较好的思路:
#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; }