http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0026
2次元配列のいい練習になりました。
問題を見てわかる通り、これはインクを端に落とされると枠から外れてしまうのでどうしよう的な所がポイントだと思います。(個人的に)
0行0列、あるいは1行1列に落とされた時の場合分けをすれば、と思ったのですがなんだかごちゃごちゃしそうだったので、結局周りに余分に2マス分(つまり14×14のマス)を用意しました。インクが落とされるのは真ん中の10×10だけにして、最終的に答えを集計するのも10×10というわけです。余分に2マスとってあるので端に大きさ3のインクを落とされても大丈夫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <stdio.h> int main( void ) { int x,y,size,i,j,blank,max; int map[14][14]; for (i = 0; i < 14; i++) { for (j = 0; j < 14; j++) { map[i][j] = 0; } } while ( scanf ( "%d,%d,%d" ,&x,&y,&size) != EOF) { if (size == 1) { map[x+1][y+2] += 1; map[x+2][y+1] += 1; map[x+2][y+2] += 1; map[x+2][y+3] += 1; map[x+3][y+2] += 1; } else if (size == 2) { map[x+1][y+1] += 1; map[x+1][y+2] += 1; map[x+1][y+3] += 1; map[x+2][y+1] += 1; map[x+2][y+2] += 1; map[x+2][y+3] += 1; map[x+3][y+1] += 1; map[x+3][y+2] += 1; map[x+3][y+3] += 1; } else if (size == 3) { map[x][y+2] += 1; map[x+1][y+1] += 1; map[x+1][y+2] += 1; map[x+1][y+3] += 1; map[x+2][y] += 1; map[x+2][y+1] += 1; map[x+2][y+2] += 1; map[x+2][y+3] += 1; map[x+2][y+4] += 1; map[x+3][y+1] += 1; map[x+3][y+2] += 1; map[x+3][y+3] += 1; map[x+4][y+2] += 1; } } blank = 0; max = 0; for (i = 2; i < 12; i++) { for (j = 2; j < 12; j++) { if (map[i][j] == 0) { blank += 1; } if (map[i][j] > max) { max = map[i][j]; } } } printf ( "%d\n" , blank); printf ( "%d\n" , max); return 0; } |
0 件のコメント:
コメントを投稿