HDU 4121 Xiangqi(模拟+恶心)
自己的代码能力太弱了啊,这个题有应该有两个方法,一个是直接判将所能走的点,是否存在被杀的可能,另一个就是先将红方可以 控制的点都找出来,然后再判断。
去年福州赛区的被板刷的题,我做了2-3天,错了10+,POJ,HDU上都交,开始的思路还清晰,后来瞎改的都不知道自己写的是什么了,今天那个有个群赛,我下了下决心,一定要BUG找出来,从网上找了代码,找数据,测了测也对啊,终于 在自己乱试的数据找到错误,一开始的思路是对的,只错了一点,结果越改,偏离的越多了,模拟题,一直是自己的短板,本来可以用2000B+解决的问题,我却写了6000B+,查错都非常困难。。。 在WA了后,一定要慎重修改,慎重提交。。。
错误:1.变量打错,自己提交都不检查啊。。2.开始把将的位置p[x][y]也初始化为1,这个从侧面反映出当时没想清楚,导致的后果也非常严重。。。3.漏了N种情况啊,本来第二个错误开始的时候没有的,最后瞎改,越改越乱了。
如果,今天那个群赛,没有这个题,我或许会等很久再去DEBUG,如果比赛遇到这种情况,我该怎么办,在知道算法正确,代码有错误时,自己总是不下个决心去找出错,或者在开始就把可能出现的问题给解决,不能总是没有提高。
模拟题,更要把细节想清楚再去写代码。
总之,多做,多敲模拟题,认真认真啊!!!!写之前先想想如何可以简单的实现,这份代码,除了马的部分,借鉴了以前做BFS的时候有简单的写法,其他的 整个代码我都觉着太失败了。
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n,x,y,i,j,k,c,r,z,q; 6 int ar[6] = {0,0,1,-1}; 7 int ac[6] = {1,-1,0,0}; 8 int hc[9] = {2,2,1,1,-2,-2,-1,-1}; 9 int hr[9] = {1,-1,2,-2,1,-1,2,-2}; 10 int hhc[9] = {1,1,0,0,-1,-1,0,0}; 11 int hhr[9] = {0,0,1,-1,0,0,1,-1}; 12 int p[17][17],key[17][17],sitc[10],sitr[10],se[10]; 13 char o[3]; 14 while(scanf("%d%d%d",&n,&x,&y)!=EOF) 15 { 16 z = 0; 17 memset(p,0,sizeof(p)); 18 memset(key,0,sizeof(key)); 19 if(n == 0&&x == 0&&y == 0) 20 break; 21 for(i = 1; i <= n; i ++) 22 { 23 scanf("%s%d%d",o,&c,&r); 24 if(o[0] == 'G') 25 { 26 sitc[i] = c; 27 sitr[i] = r; 28 se[i] = 1; 29 } 30 else if(o[0] == 'R') 31 { 32 sitc[i] = c; 33 sitr[i] = r; 34 se[i] = 2; 35 } 36 else if(o[0] == 'C') 37 { 38 sitc[i] = c; 39 sitr[i] = r; 40 se[i] = 3; 41 } 42 else if(o[0] == 'H') 43 { 44 sitc[i] = c; 45 sitr[i] = r; 46 se[i] = 4; 47 } 48 p[c][r] = 1; 49 } 50 for(i = 1; i <= n; i ++) 51 { 52 if(se[i] == 1) 53 { 54 for(j = sitc[i]-1; j >= 1; j --) 55 { 56 if(p[j][sitr[i]] != 0) 57 { 58 key[j][sitr[i]] = 1; 59 break; 60 } 61 else 62 key[j][sitr[i]] = 1; 63 } 64 } 65 else if(se[i] == 2) 66 { 67 for(j = sitc[i]-1; j >= 1; j --) 68 { 69 if(p[j][sitr[i]] != 0) 70 { 71 key[j][sitr[i]] = 1; 72 break; 73 } 74 else 75 key[j][sitr[i]] = 1; 76 } 77 for(j = sitc[i]+1; j <= 10; j ++) 78 { 79 if(p[j][sitr[i]] != 0) 80 { 81 key[j][sitr[i]] = 1; 82 break; 83 } 84 else 85 key[j][sitr[i]] = 1; 86 } 87 for(j = sitr[i]-1; j >= 1; j --) 88 { 89 if(p[sitc[i]][j] != 0) 90 { 91 key[sitc[i]][j] = 1; 92 break; 93 } 94 else 95 key[sitc[i]][j] = 1; 96 } 97 for(j = sitr[i]+1; j <= 10; j ++) 98 { 99 if(p[sitc[i]][j] != 0) 100 { 101 key[sitc[i]][j] = 1; 102 break; 103 } 104 else 105 key[sitc[i]][j] = 1; 106 } 107 } 108 else if(se[i] == 3) 109 { 110 z = 0; 111 for(j = sitc[i]-1; j >= 1; j --) 112 { 113 if(p[j][sitr[i]] == 1) 114 { 115 z = 1; 116 break; 117 } 118 } 119 if(z) 120 { 121 for(k = j-1; k >= 1; k --) 122 { 123 if(p[k][sitr[i]] != 0) 124 { 125 key[k][sitr[i]] = 1; 126 break; 127 } 128 else 129 key[k][sitr[i]] = 1; 130 } 131 } 132 z = 0; 133 for(j = sitc[i]+1; j <= 10; j ++) 134 { 135 if(p[j][sitr[i]] == 1) 136 { 137 z = 1; 138 break; 139 } 140 } 141 if(z) 142 { 143 for(k = j+1; k <= 10; k ++) 144 { 145 if(p[k][sitr[i]] != 0) 146 { 147 key[k][sitr[i]] = 1; 148 break; 149 } 150 else 151 key[k][sitr[i]] = 1; 152 } 153 } 154 z = 0; 155 for(j = sitr[i]-1; j >= 1; j --) 156 { 157 if(p[sitc[i]][j] == 1) 158 { 159 z = 1; 160 break; 161 } 162 } 163 if(z) 164 { 165 for(k = j-1; k >= 1; k --) 166 { 167 if(p[sitc[i]][k] != 0) 168 { 169 key[sitc[i]][k] = 1; 170 break; 171 } 172 else 173 key[sitc[i]][k] = 1; 174 } 175 } 176 z = 0; 177 for(j = sitr[i]+1; j <= 10; j ++) 178 { 179 if(p[sitc[i]][j] == 1) 180 { 181 z = 1; 182 break; 183 } 184 } 185 if(z) 186 { 187 for(k = j+1; k <= 10; k ++) 188 { 189 if(p[sitc[i]][k] != 0) 190 { 191 key[sitc[i]][k] = 1; 192 break; 193 } 194 else 195 key[sitc[i]][k] = 1; 196 } 197 } 198 } 199 else if(se[i] == 4) 200 { 201 for(j = 0; j <= 7; j ++) 202 { 203 if(sitc[i]+hc[j]>=1&&sitc[i]+hc[j]<=10&&sitr[i]+hr[j]>=1&&sitr[i]+hr[j]<=10) 204 { 205 if(p[sitc[i]+hhc[j]][sitr[i]+hhr[j]] == 0) 206 { 207 key[sitc[i] + hc[j]][sitr[i] +hr[j]] = 1; 208 } 209 } 210 } 211 } 212 } 213 z = 0; 214 for(i = 0; i <= 3; i ++) 215 { 216 if(x+ac[i] >= 1 &&x+ac[i] <= 3 && y+ar[i] >= 4 &&y +ar[i] <= 6) 217 { 218 if(key[x+ac[i]][y+ar[i]] == 0) 219 { 220 z = 1; 221 break; 222 } 223 } 224 } 225 if(z) 226 printf("NO\n"); 227 else 228 printf("YES\n"); 229 } 230 return 0; 231 }