CF3C Tic-tac-toe 題解
阿新 • • 發佈:2022-03-13
一個需要多多照顧細節的模擬,值得評黃級
需要記錄的變數是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; }