結果

提出番号 837
提出者 puni
言語 C++
提出日時 2017-08-01 14:56:44
問題名 (42)オセロ
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 2KB
2 AC 100% 2ms 7KB
3 AC 100% 2ms 2KB
4 AC 100% 2ms 0KB
5 AC 100% 2ms 3KB

ソースコード

#include <iostream>
#include <vector>
using namespace std;

bool inside(int x, int y, int lim){
	return 0 <= x && x < lim && 0 <= y && y < lim;
}

struct othelloPlay{
	int player = 0, boardsize;
	bool passed = false;
	vector<vector<int>> board;

	void init(int s = 8){
		boardsize = s;
		board = vector<vector<int>>(boardsize, vector<int>(boardsize, -1));
		int mid = boardsize / 2;
		board[mid - 1][mid] = board[mid][mid - 1] = 0;
		board[mid - 1][mid - 1] = board[mid][mid] = 1;
	}

	int pieceCount(){
		int r = 0;
		for(int i = 0; i < board.size(); i++) for(int j = 0; j < board[0].size(); j++) r += board[i][j] != -1;
		return r;
	}

	int canPut(int x, int y){
		if(board[x][y] != -1) return 0;
		int r = 0, dd[] = {0, 1, 1, 0, -1, 1, -1, -1, 0};
		for(int i = 0; i < 8; i++){
			bool f = false;
			int count = 0, xx = x + dd[i], yy = y + dd[i + 1];
			while(inside(xx, yy, boardsize)){
				if(board[xx][yy] != !(player & 1)){
					f = board[xx][yy] == (player & 1);
					break;
				}
				count++;
				xx += dd[i];
				yy += dd[i + 1];
			}
			if(f && count) r += count;
		}
		return r;
	}

	vector<pair<int, int>> canMoves(){
		vector<pair<int, int>> vp;
		for(int i = 0; i < boardsize; i++) for(int j = 0; j < boardsize; j++) if(canPut(i, j)) vp.push_back(make_pair(i, j));
		return vp;
	}

	int put(int x, int y){
		if(!canPut(x, y)) return 0;
		board[x][y] = player & 1;
		int r = 1, dd[] = {0, 1, 1, 0, -1, 1, -1, -1, 0};
		for(int i = 0; i < 8; i++){
			bool f = false;
			int xx = x + dd[i], yy = y + dd[i + 1];
			vector<pair<int, int>> gets;
			while(inside(xx, yy, boardsize)){
				if(board[xx][yy] != !(player & 1)){
					f = board[xx][yy] == (player & 1);
					break;
				}
				gets.push_back(make_pair(xx, yy));
				xx += dd[i];
				yy += dd[i + 1];
			}
			if(f && gets.size()){
				for(auto p:gets) board[p.first][p.second] = player & 1;
				r += gets.size();
			}
		}
		player++;
		return r;
	}

	bool pass(){
		bool prev = passed;
		player++;
		passed = true;
		return prev;
	}
};

int main(){
	othelloPlay othello;
	othello.init();
	for(int i = 0; i < 8; i++){
		string s;
		cin >> s;
		for(int j = 0; j < 8; j++) othello.board[i][j] = s[j] == '-' ? -1 : s[j] == 'w';
	}
	int c;
	string t;
	cin >> c >> t;
	int a = t[0] - 'A', b = t[1] - '0';
	cerr << a << ' ' << b << endl;
	othello.player = c;
	othello.put(--b, a);
	for(int i = 0; i < 8; i++){
		for(int j = 0; j < 8; j++) cout << (othello.board[i][j] == -1 ? '-' : "bw"[othello.board[i][j] == 1]);
		cout << endl;
	}
}