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;
}