다른 사람 소스를 보니까 내가 너무 어렵게 생각했던 것 같다.
(i, j)에서 주변 각 8방향에 대해 악수를 했다/안했다로 xxxxxxxx의 비트로 저장해서 주변 8방향을 하나씩 악수했다. (비트를 참고하여 이미 악수했다면 횟수로 세지 않았다.)
#include <cstdio> #include <cstring> int DY[]={-1,-1,-1,0,0,1,1,1}; int DX[]={-1,0,1,-1,1,-1,0,1}; int main(){ int i, j, h, w; scanf("%d %d ", &h, &w); char s[50][51]; for(i=0; i<h; ++i) scanf("%s ", s[i]); int y=0, x=0, shakeCount=0; for(i=0; i<h; ++i){ for(j=0; j<w; ++j){ if(s[i][j] != '.') continue; int r = 0; for(int k=0; k<8; ++k){ int dy=i+DY[k], dx=j+DX[k]; if(dy < 0 || dy >= h || dx < 0 || dx >= w) continue; r += s[dy][dx] == 'o'; } if(shakeCount < r){ shakeCount = r, y = i, x = j; } } } s[y][x] = 'o'; int r = 0; int shake[50][50]={}; for(i=0; i<h; ++i){ for(j=0; j<w; ++j){ if(s[i][j] != 'o') continue; for(int k=0; k<8; ++k){ int dy=i+DY[k], dx=j+DX[k]; if(dy < 0 || dy >= h || dx < 0 || dx >= w || s[dy][dx] != 'o') continue; int bit = 1<<(7-k); r += (shake[dy][dx] & bit) == bit; shake[i][j] |= 1<<k; shake[dy][dx] |= bit; } } } printf("%d", r); return 0; }
댓글 없음:
댓글 쓰기