1 条题解

  • 0
    @ 2024-12-24 9:54:33

    C :

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    
    int board[200][200];
    int visit[200][200];
    #define b(i,j) board[(i)+100][(j)+100]
    #define v(i,j) visit[(i)+100][(j)+100]
    
    int i,j,k,m,n,x,y,z,cookie = 1;
    char P;
    
    dump(){
       int i,j;
       for (i=-z;i<=z;i++) {
          for (j=-z;j<=z;j++) {
             if (b(i,j)) printf("%c",b(i,j));
             else printf("+");
          }
          printf("\n");
       }
       printf("\n");
       return;
       for (i=-z;i<=z;i++) {
          for (j=-z;j<=z;j++) {
             printf("%3d",v(i,j));
          }
          printf("\n");
       }
       printf("\n");
    }
    
    dofilled(int x, int y, int c, int B){
       //printf("dofilled %d %d %d %d\n",x,y,c,B);
       if (v(x,y) == cookie) return 1;
       if (b(x,y) == -1) return 1;
       if (b(x,y) == B) return 1;
       if (b(x,y) != c) return 0;
       v(x,y) = cookie;
       return dofilled(x+1,y,c,B) && dofilled(x-1,y,c,B)
           && dofilled(x,y+1,c,B) && dofilled(x,y-1,c,B); 
    }
    
    dofill(int x, int y, int d) {
       if (v(x,y) != cookie) return 0;
       if (b(x,y) == d) return 0;
       b(x,y) = d;
       v(x,y) = 0;
       return 1 + dofill(x+1,y,d) + dofill(x-1,y,d)
          + dofill(x,y+1,d) + dofill(x,y-1,d);
    }
    
    int reach(int x, int y, int c, int B, int d){
       cookie++;
       if (!dofilled(x,y,c,B)) return 0;
       return dofill(x,y,d);
    }
    int owns[256], caps[256];
    update(int x, int y, int P, int Q){
       int cap = reach(x,y,Q,P,0);
       caps[P] += cap;
       return cap;
    }
    final(){
       int x,y;
       for (x=-z;x<=z;x++) {
          for (y=-z;y<=z;y++) {
             owns['W'] += reach(x,y,0,'W','w');
             owns['B'] += reach(x,y,0,'B','b');
          }
       }
    }
    
    main(){
       while (2 == scanf("%d%d",&n,&m) && n) {
          z = (n-1)/2;
          memset(board,0,sizeof(board));
          memset(owns,0,sizeof(owns));
          memset(caps,0,sizeof(owns));
          for (i=-z;i<=z;i++) b(i,-z-1) = b(i,z+1) = b(-z-1,i) = b(z+1,i) = -1;
          for (i=0;i<m;i++) {
             if (3 != scanf(" %c ( %d , %d )",&P,&x,&y)) printf("bad input format\n");
             assert(x >= -z && y >= -z && x <= z && y <= z);
             if (b(x,y)) printf("board occupied %d %d\n",x,y);
             b(x,y) = P;
             update(x+1,y,P,'B'+'W'-P);
             update(x-1,y,P,'B'+'W'-P);
             update(x,y+1,P,'B'+'W'-P);
             update(x,y-1,P,'B'+'W'-P);
             if (update(x,y,'B'+'W'-P,P)) printf("bad move!");
             
             //dump();
          }
          final();
          //dump();
          printf("%d %d\n",owns['B']+caps['B'], owns['W']+caps['W']);
       }
       if (n || m) printf("missing/mangled end delimiter\n");
    }
    
    
    • 1

    信息

    ID
    1236
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者