现在的位置: 首页 > 综合 > 正文

2009资格赛A题 small文件的比较笨的解决办法

2013年03月01日 ⁄ 综合 ⁄ 共 3171字 ⁄ 字号 评论关闭

人家参赛者最快的半个多小时就搞定了,我貌似搞了好几天,时间加起来还好没有人家的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;
}

抱歉!评论已关闭.