C. A Mist of Florescence

 

http://codeforces.com/contest/989/problem/C

 

这磨人的小妖精……

 

贪心,不难发现正确性,用一个A、B、C、D、分别哪拿一个出来画框,每一个框处理一种字母

 

例如一个框长这样:

 

 

加层后长这样:

 

反正都只花费1个A

 

处理字母后长这样:

 

 

我用1个A画框来处理剩余B,1个B画框来处理剩余C,以此类推。

我的框长度都为50,如果有字母要处理,框占2行,字母2行,不够再2行,最多6行就可以处理完100个字符。(因为每2行处理49个)。

处理一个字符最多8行,4*8=32,50行是足够的。

 

 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4         Scanner io = new Scanner(System.in);
 5         
 6         char[][] ans = new char[200][200];
 7         //ans[p1][]:正在处理的字符串
 8         int p1 = 0;
 9         int[][] a = new int[4][2];
10 
11         for (int i = 0; i < 4; i++) {
12             a[i][0] = io.nextInt();
13             a[i][1] = 'A' + i;
14         }
15 
16         for (int i = 0; i < 4; i++) {
17 
18             //框字符ch1,处理字符ch2,有num个ch2处理
19             int j = i == 3 ? 0 : i + 1;
20             char ch1 = (char) a[i][1], ch2 = (char) a[j][1];
21             //不管num个数多少,都画框
22             for (int k = 0; k < 50; k++) ans[p1][k] = ch1;
23             p1++;
24 
25             int num = a[j][0] - 1;
26             //处理ch2
27             if (num>0){
28                 //x是处理行1,y是处理行2,z是列指针,v在01之间不停变换
29                 int x = p1, y = p1 + 1, z = 0, v = 0;
30                 char[] t = new char[]{ch1, ch2};
31                 //框的右边界
32                 ans[p1][49]=ans[p1+1][49]=ch1;
33                 p1+=2;
34                 while (num-- > 0) {
35                     //2行不够
36                     if (z==49){
37                         for (int k = 0; k < 50; k++) ans[y+1][k]=ch1;
38                         x+=3;y+=3;p1+=3;z=0;v^=1;
39                         ans[x][49]=ans[y][49]=ch1;
40                     }
41                     //画ch2
42                     ans[x][z] = t[v];
43                     ans[y][z++] = t[v^=1];
44                 }
45                 //处理完ch2后补全字符串后面的空余部分
46                 for (int k=z;ans[x][k]==0&&z-1>=0;k++){
47                     ans[x][k]=ans[x][z-1];
48                     ans[y][k]=ans[y][z-1];
49                 }
50             }
51             //画下半边框
52             for (int k = 0; k < 50; k++) ans[p1][k] = ch1;
53             p1++;
54         }
55 
56         System.out.println(p1+" "+50);
57         for (int i = 0; i <p1; i++) System.out.println(new String(ans[i]).substring(0,50));
58     }
59 }
原文地址:https://www.cnblogs.com/towerbird/p/11248454.html