标签:puts tin event 技术分享 pen 题意 枚举 技术 --
题意是说在 h 行 w 列的矩阵中,通过设计使得尽可能多的行或列能满足题中的平衡条件。
如果行数(列数)是奇数,那么每一列(行)一定不能平衡,就要按照满足每一行(列)平衡,输出“ () “;若行数和列数同时是奇数,则设计不出任何一行或一列平衡;
当行数和列数同时为偶数时,情况是最复杂的,开始的时候只是想到两个数字谁大就去满足谁的平衡,结果完全不对,因为不只是“ ()()() ”是平衡的,像“ ((())) ”这种也是平衡的。也就是说在行满足平衡条件的同时列也可能满足平衡条件,比如:
" (((( " 就在满足每一列平衡的同时多满足了一行,然后......然后我智商就不够了。看了别人的博客才知道,可以通过“牺牲”掉最外面的一圈,也就是两行和两列,其他各行各列就都能平衡,也就是都能达到 ans = h + w - 4 ;但是在行数和列数的最小值小于 4 的时候,这种
()() “牺牲”的做法并不是最优的,此时通过暴力的方法去枚举找到(2,2),(2,4),(4,2),(4,4)的图案即可。
)()( 这种做法是怎么想出来的呢?请移步去大佬的博客吧.......
))))
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int t,a,b; 6 scanf("%d",&t); 7 while(t--) 8 { 9 scanf("%d%d",&a,&b); 10 if((a&1)&&(b&1)) 11 { 12 for(int i = 0; i < a; i++) 13 { 14 for(int j = 0; j < b; j++) 15 printf("("); 16 printf("\n"); 17 } 18 } 19 else if((a&1)&&!(b&1)) 20 { 21 for(int i = 0; i < a; i++) 22 { 23 for(int j = 0; j < b; j++) 24 if(j&1) printf(")"); 25 else printf("("); 26 printf("\n"); 27 } 28 } 29 else if(!(a&1)&&(b&1)) 30 { 31 for(int i = 0; i < a; i++) 32 { 33 for(int j = 0; j < b; j++) 34 if(i&1) printf(")"); 35 else printf("("); 36 printf("\n"); 37 } 38 } 39 else 40 { 41 /* if(a > b) 42 { 43 for(int i = 0; i < a; i++) 44 { 45 for(int j = 0; j < b; j++) 46 if(j&1) printf(")"); 47 else printf("("); 48 printf("\n"); 49 } 50 } 51 else 52 { 53 for(int i = 0; i < a; i++) 54 { 55 for(int j = 0; j < b; j++) 56 if(i&1) printf(")"); 57 else printf("("); 58 printf("\n"); 59 } 60 } 61 */ 62 if(a==2 && b==2) 63 { 64 puts("()"); 65 puts(")("); 66 continue; 67 } 68 if(b==2) 69 { 70 for(int i = 0; i < a; i++) 71 puts("()"); 72 continue; 73 } 74 if(a==2) 75 { 76 for(int i = 0; i < b; i++) 77 printf("("); 78 printf("\n"); 79 for(int i = 0; i < b; i++) 80 printf(")"); 81 printf("\n"); 82 continue; 83 } 84 if(a==4) 85 { 86 for(int i = 0; i < b; i++) 87 printf("("); 88 printf("\n"); 89 for(int i = 0; i < b; i++) 90 { 91 if(i < b/2)printf(")"); 92 else printf("("); 93 } 94 printf("\n"); 95 for(int i = 0; i < b; i++) 96 { 97 if(i < b/2)printf("("); 98 else printf(")"); 99 } 100 printf("\n"); 101 for(int i = 0; i < b; i++) 102 printf(")"); 103 printf("\n"); 104 continue; 105 } 106 if(b==4) 107 { 108 for(int i = 0; i < a; i++) 109 { 110 if(i < a/2) puts("()()"); 111 else puts("(())"); 112 } 113 continue; 114 } 115 for(int i = 0; i < a; i++) 116 { 117 for(int j = 0; j < b; j++) 118 { 119 if(i == 0|| j == 0) printf("("); 120 else if(i == a-1 || j == b-1) printf(")"); 121 else 122 { 123 if(j == 0) printf("("); 124 else if(j == b-1) printf(")"); 125 else 126 { 127 if(!(i&1)) 128 if(j&1) printf("("); 129 else printf(")"); 130 else 131 if(j&1) printf(")"); 132 else printf("("); 133 } 134 } 135 } 136 printf("\n"); 137 } 138 } 139 } 140 return 0; 141 }
标签:puts tin event 技术分享 pen 题意 枚举 技术 --
原文地址:https://www.cnblogs.com/Taskr212/p/9490290.html