导航

【stack果然神器】code forces 394C Dominoes

Posted on 2014-02-22 20:17  ghostll  阅读(280)  评论(0编辑  收藏  举报

code forces   394C   Dominoes               题目链接:http://codeforces.com/problemset/problem/394/C

题目大意:用一个两位数字组合描述一张多米诺骨牌,这两位数字只可能取0或1,这样骨牌就一共有四种(“00”、“11”、“10”、“01“),给出两个整数m、n代表有m行n列的骨牌,下面给出这组m×n的骨牌排列(两个骨牌之间有一空格)。得到排列后统计每一列有多少个”1“,设num为其最大值,然后打乱重排,目的是使重排后的num最小。

题目分析:

        贪心法。先放11,再放10或01(由于重排时可以旋转180°,所以10和01没有区别),最后放00.

        蛇形排列。排第一、三、五……行时从左向右放,反之从右向左放。

code:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<cstdio>  
  2. #include<stack>  
  3. #include<queue>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     int m,n,i,j,c00=0,c11=0,c01=0;  
  8.     stack<char>s;  
  9.     char c[4];  
  10.     scanf("%d%d",&m,&n);  
  11.     for(i=0;i<n*m;i++)  
  12.     {  
  13.         scanf("%s",c);  
  14.         switch(c[0]+c[1])  
  15.         {  
  16.             case 96:c00++;break;  
  17.             case 97:c01++;break;  
  18.             case 98:c11++;  
  19.         }  
  20.     }  
  21.     for(i=0;i<m;i++)  
  22.     {  
  23.         if(i%2)  
  24.         for(j=0;j<n;j++)  
  25.         {  
  26.             if(c11)  
  27.             {  
  28.                 s.push(j==0?'\n':' ');  
  29.                 s.push('1');  
  30.                 s.push('1');  
  31.                 c11--;  
  32.             }  
  33.             else if(c01)  
  34.             {  
  35.                 s.push(j==0?'\n':' ');  
  36.                 s.push('0');  
  37.                 s.push('1');  
  38.                 c01--;  
  39.             }  
  40.             else  
  41.             {  
  42.                 s.push(j==0?'\n':' ');  
  43.                 s.push('0');  
  44.                 s.push('0');  
  45.             }  
  46.         }  
  47.         else  
  48.         for(j=0;j<n;j++)  
  49.         {  
  50.             if(c11)  
  51.             {  
  52.                 printf("%s%s","11",j==n-1?"\n":" ");  
  53.                 c11--;  
  54.             }  
  55.             else if(c01)  
  56.             {  
  57.                 printf("%s%s",i%2?"10":"01",j==n-1?"\n":" ");  
  58.                 c01--;  
  59.             }  
  60.             else printf("%s%s","00",j==n-1?"\n":" ");  
  61.         }  
  62.         while(!s.empty())printf("%c",s.top()),s.pop();  
  63.     }  
  64.     return 0;  
  65. }  

PS:stack果然神器,省了不少代码啊……

我的专栏