7th Contest of Newbies, UVa-12398 : NumPuzz I
問題概要
3*3のmod 10なライツアウトがある。解答のコマンド列が与えられるので初期盤面を復元する問題。
解法
5近傍に1ずつ配る。
acceptされたコード
#include <cstdio> #include <cstring> #include <cctype> using namespace std; int dx[] = {0, 0, 0, 1, -1}, dy[] = {0, 1, -1, 0, 0}; int xs[0x100], ys[0x100]; int board[3][3]; char buf[201]; void pre(){ ys['a'] = 0; xs['a'] = 0; ys['b'] = 0; xs['b'] = 1; ys['c'] = 0; xs['c'] = 2; ys['d'] = 1; xs['d'] = 0; ys['e'] = 1; xs['e'] = 1; ys['f'] = 1; xs['f'] = 2; ys['g'] = 2; xs['g'] = 0; ys['h'] = 2; xs['h'] = 1; ys['i'] = 2; xs['i'] = 2; } bool init(){ return gets(buf); } void solve(){ memset(board, 0, sizeof(board)); const int L = strlen(buf); for(int i=0; i<L; i++)if(isalpha(buf[i])){ for(int k=0; k<5; k++){ int ny = ys[buf[i]] + dy[k], nx = xs[buf[i]] + dx[k]; if(0<=ny && ny<3 && 0<=nx && nx<3){ board[ny][nx] = ( board[ny][nx] + 1 ) % 10; } } } for(int i=0; i<3; i++){ for(int j=0; j<3; j++){ printf("%d%c", board[i][j], j==2?'\n':' '); } } } int main(){ int c = 0; pre(); while(init()){ printf("Case #%d:\n", ++c); solve(); } return 0; }