1. 程式人生 > 其它 >CF3C Tic-tac-toe 題解

CF3C Tic-tac-toe 題解

一個需要多多照顧細節的模擬,值得評黃級

需要記錄的變數是X的個數和0的個數(後來才發現是0,一直以為是O)

不合法的情況比較多:都贏了;一方贏了之後又多下;兩方之間的棋子數量關係不對……

判斷同一種棋子連續3個的方法用四重迴圈加上一個小遞迴,由於n只能是3,所以爆炸性的五重迴圈並不會有什麼影響。

程式碼呼之欲出:

#include <bits/stdc++.h>

using namespace std;

char c[4][4];
int Xs, Os;
bool Xwin, Owin;
void input()
{
	for (int i = 1; i <= 3; i++)
	{
		for (int j = 1; j <= 3; j++)
		{
			cin >> c[i][j];
			if (c[i][j] == 'X')
				Xs++;
			else if (c[i][j] == '0')
				Os++;
		}
	}
}
void dfs(int a,int b,int x,int y,int e,char t)
{
	if(e == 3){
		if(t=='X') Xwin = true;
		else Owin = true;
		return;
	}
	else if(a + x < 4 && a + x > 0 && b + y < 4 && b + y > 0 && c[a + x][b + y] == t)//如果沒出界,並且是同樣的棋子
		dfs(a , b , a + x , b + y , e + 1 , t);//訪問下一個座標
}

int main()
{
	input();
	for (int i = 1; i <= 3; i++)
	{
		for (int j = 1; j <= 3; j++)
		{
			if (c[i][j] == '.' || i == 2 && j == 2)
				continue;
			for (int x = -1; x <= 1; x ++)
			{
				for (int y = -1; y <= 1; y++)
				{
					if (x == 0 && y == 0)
						continue;
					dfs(x, y, i, j, 1, c[i][j]);
				}
			}
		}
	}
	if(Os > Xs || Xs - Os > 1 || Owin&&Xwin){
		cout << "illegal" << endl;
		return 0;//返回 
	}
	if (Owin)
	{
		if (Xs != Os)
		{
			cout << "illegal" << endl;
			return 0;
		}
	}
	else if ( Xwin )
	{
		if (Os != Xs - 1)
		{
			cout << "illegal" << endl;
			return 0;
		}
	}
	if (Xs + Os == 9 && !Owin && !Xwin)
	{
		cout << "draw" << endl;
		return 0;
	}
	
	if (Owin){
		cout << "the second player won" << endl; return 0;
	}
	else if (Xwin) {
		cout << "the first player won" << endl; return 0;
	}
	
	if (Xs == Os)
		cout << "first" << endl;
	else
		cout << "second" << endl;
	return 0;
}