人家参赛者最快的半个多小时就搞定了,我貌似搞了好几天,时间加起来还好没有人家的100倍!!
思路有了,不过编码不过……,能力不足啊!值得锻炼。
今天终于搞定了小文件输入的例子。
看到了绿色的correct!还是挺兴奋的。不过程序没有经过其他的测试,不知道漏洞有多少……,呵呵。
把题目弄懂的是第一步,这是英语水平的关系,还是很重要的。
第二步重点的是对于数组的操作,这个比较绕,我就绕了很久很久……,唉,脑子不好使啊,还有待于锻炼。
别的不多说了,贴代码,是俺调试完成的代码,保留原汁原味的调试信息……,哈哈,无数的printf,printf调试大法!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
希望大家多多提出意见和建议哈
下载google code jam上的小型输入文件,我在linux下,编译完后用./program inputfile.in > output.out
然后提交out文件,呵呵,反正我看到绿色的correct!了,如果不进行重定向,则显示在终端上。
windows下面用cmd命令行program.ext inputfile.in了。^^
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
FILE *fp=NULL;
char cLine[288];
int iMaxLine = 288;
int L=0,D=0,N=0;
char Dlines[25][12];
int bitmap[25][10];
char Nlines[10][288];
char Nword[64];
int i=0,j=0,k=0,m=0,p=0,q=0;
/*-------------------------------------------------------------------*/
//得到 L D N , Dlines , Nlines.
fp = fopen(argv[1],"r");
while(fgets(cLine,iMaxLine,fp) != NULL) {
if (i == 0) {
//printf("%2d ",i);
sscanf(cLine,"%d %d %d",&L,&D,&N);
//printf("%d %d %d/n",L,D,N);
}
#if 1
else if ((i > 0) && (i <= D)) {
//printf("%2d ",i);
sscanf(cLine,"%s",Dlines[i-1]);
//printf("%2d:%s/n",i-1,Dlines[i-1]);
} else if ((i > D) && (i <= 1+D+N)) {
//printf("%2d ",i);
sscanf(cLine,"%s",Nlines[i-1-D]);
//printf("%2d:%s/n",i-1-D,Nlines[i-1-D]);
} else {
;
}
#endif
i++;
}
fclose(fp);
/*-------------------------------------------------------------------*/
//for (i = 0 ; i < N ; i++) { // 循环N行,每次解析N的一行
for (i = 0 ; i < N ; i++) { // 循环N行,每次解析N的一行
printf("Case #%d:",i+1);
k = 0; // 每一行之前初始化k,k作为N[i]行的元素遍历指针
for (p = 0 ; p < D ; p++) { // 每一N行开始解析前,清空位图.
for (q = 0 ; q < L ; q++) {
bitmap[p][q] = 0;
}
}
for (j = 0 ; j < L ; j++) { // 循环L列,N的一行要解析L次
for (m = 0 ; m < 64 ; m++) {
Nword[m] = 0;
}
m = 0;
if (Nlines[i][k] == '(') { // 如果遇见左括号
k++;
while (Nlines[i][k] != ')') { // 下一个元素不为右括号,即括号没有闭合前
Nword[m] = Nlines[i][k]; // 括号中的元素赋值给Nword
k++;
m++;
}
k++; // 跳出while则,肯定遇到了右括号,指针+1,指向下一个元素位置
} else { // 没有遇到左括号,表示这个词没有多种可能,只有一种可能。
Nword[m] = Nlines[i][k]; // 则把这个元素赋值给Nword
k++; // 指针指向下一个元素
}
//printf("%s/n",Nword); // 得到每一N行的 每一L列字符串
//printf("strlen(Nword):%d/n",strlen(Nword));
// 一次肯定可以遍历一个匹配的括号中的元素
// 得到一个匹配的括号中的字符串
for (p = 0 ; p < D ; p++) { // 循环D行
//printf("D:%2d:%2d:%c/n",p,j,Dlines[p][j]);
#if 1
for (q = 0 ; q < strlen(Nword) ; q++) { // 循环Nword长度
//printf("%c",Dlines[p][j]);
#if 1
if (Dlines[p][j] == Nword[q]) { // 每一行的第j列 vs Nword
bitmap[p][j] = 1;
//printf("%2d,%2d,%2d:",p,j,bitmap[p][j]);
} else {
//printf("%2d,%2d,%2d:",p,j,bitmap[p][j]);
}
#endif
}
#endif
} // end D
} // end L
#if 1
int count = 0;
int COUNT = 0;
for (p = 0 ; p < D ; p++) {
count = 0;
for (q = 0 ; q < L ; q++) {
if (bitmap[p][q] == 1) {
count ++;
}
}
if (count == L) {
COUNT++;
}
}
printf(" %d/n",COUNT);
#endif
#if 0
printf("/n");
for (p = 0 ; p < D ; p++) {
for (q = 0 ; q < L ; q++) {
printf("%d",bitmap[p][q]);
}
printf("/n");
}
printf("----/n");
#endif
} // end N
/*-------------------------------------------------------------------*/
#if 0
printf("%d %d %d/n",L,D,N);
#if 1
for (i=0; i<D; i++) {
printf("%2d:%s/n",i,Dlines[i]);
}
for (i=0; i<N; i++) {
printf("%2d:%s/n",i,Nlines[i]);
}
#endif
#endif
return 0;
}