ECNA 2018 E The Punctilious Cruciverbalist

题目描述是一个填单词的游戏,要按给定的计分方法按顺序填,这个不难。不过标号要自己算出来,这个不注意容易弄错。总而言之就是个小模拟题。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. char s[100];
  5. int fi[100][100];
  6.  
  7. struct Node{
  8.     int dx, dy;
  9.     int m,msum;
  10.     int num;
  11.     int r; //0 row or 1 col
  12.     void c(){int g=__gcd(m,msum);m/=g;msum/=g;}
  13.     bool operator<(const Node &v) const{
  14.     if ((double)m/msum==(double)v.m/v.msum){
  15.         if (r==v.r) return num<v.num;
  16.         return r<v.r;
  17.     }
  18.     return (double)m/msum>(double)v.m/v.msum;
  19.     }
  20.     void prt(){
  21.     printf("%d%c %d/%d (%d,%d)\n",num,r?'D':'A',m,msum,dx,dy);
  22.     }
  23. }clu[10000];
  24. int n,m;
  25.  
  26. bool fill(){
  27.     int cluc=0;
  28.     int gcnt=1;
  29.     for (int i=0;i<n;i++){
  30.     for (int j=0;j<m;j++) if (fi[i][j]!=-1){
  31.         bool gg=0;
  32.         if (j==0 || fi[i][j-1]==-1){
  33.         bool used=0; int k;
  34.         gg=1;
  35.         for (k=j;k<m && fi[i][k]!=-1;k++){
  36.             if (fi[i][k]==0) used=1;
  37.         }
  38.         k--; int r=1,msum=0,m=0;
  39.         if (!used) goto next;
  40.         for (;k>=j;k--,r++){
  41.             if (fi[i][k]==1) m+=r;
  42.             msum+=r; 
  43.         }
  44.         clu[cluc++]=(Node){i,j,m,msum,gcnt,0};
  45.         clu[cluc-1].c();
  46.         }
  47. next:
  48.         if (i==0 || fi[i-1][j]==-1){
  49.         bool used=0; int k;
  50.         gg=1;
  51.         for (k=i;k<n && fi[k][j]!=-1;k++){
  52.             if (fi[k][j]==0) used=1;
  53.         }
  54.         k--; int r=1,msum=0,m=0;
  55.         if (!used) goto next2;
  56.         for (;k>=i;k--,r++){
  57.             if (fi[k][j]==1) m+=r;
  58.             msum+=r;
  59.         }   
  60.         clu[cluc++]=(Node){i,j,m,msum,gcnt,1};
  61.         clu[cluc-1].c();
  62.         }
  63. next2:
  64.         if (gg) gcnt++;
  65.     }
  66.     }
  67.     if (cluc==0) return 0;
  68.     sort(clu,clu+cluc);
  69.     //for (int i=0;i<cluc;i++) clu[i].prt();
  70.     if (clu[0].r==0){
  71.     printf("%dA\n",clu[0].num);
  72.     int i=clu[0].dx,k=clu[0].dy;
  73.     for (;k<m && fi[i][k]!=-1;k++)
  74.         fi[i][k]=1; 
  75.     }
  76.     else{
  77.     printf("%dD\n",clu[0].num);
  78.     int j=clu[0].dy,k=clu[0].dx;
  79.     for (;k<n && fi[k][j]!=-1;k++){
  80.         fi[k][j]=1;
  81.     }
  82.  
  83.     }
  84.     //for (int i=0;i<n;i++,cout<<'\n') for (int j=0;j<m;j++) cout<<fi[i][j]<<' ';
  85.     //getchar(); getchar();
  86.     return 1;
  87. }
  88.  
  89. int main(){
  90.     cin>>n>>m;
  91.     for (int i=0;i<n;i++){
  92.     cin>>s;
  93.     for (int j=0;j<m;j++){
  94.         if (s[j]=='.') fi[i][j]=0;
  95.         else if (s[j]=='#') fi[i][j]=-1;
  96.         else fi[i][j]=1;
  97.     }
  98.  
  99.     }
  100.     while (fill());
  101.     return 0;
  102. }

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注