Etibarlı Tic-Tac-Toe Dövlət LeetCode Həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon alma Bloomberg Facebook google microsoft KahinBaxılıb 24

Problem bəyanat

Etibarlı Tic-Tac-Toe Dövlət LeetCode Həlli – Bizə simli massiv lövhəsi kimi Tic-Tac-Toe lövhəsi verilir və etibarlı tic-tac- zamanı bu lövhənin mövqeyinə çatmaq mümkün olarsa, həqiqəti qaytarmağımız xahiş olunur. barmaq oyunu. Lövhə ' ', 'X' və 'O' simvollarından ibarət 3 x 3 massivdir. ' ' simvolu boş kvadratı təmsil edir.

Tic-Tac-Toe qaydaları:

  • Oyunçular növbə ilə simvolları boş kvadratlara yerləşdirirlər.
  • Birinci oyunçu həmişə 'X' simvollarını, ikinci oyunçu isə həmişə 'O' simvollarını yerləşdirir.
  •  'X' və 'O' simvolları həmişə boş kvadratlara yerləşdirilir, heç vaxt doldurulmayanlar.
  • Hər hansı bir sətir, sütun və ya diaqonalı dolduran üç eyni (boş olmayan) simvol olduqda oyun başa çatır.
  • Bütün kvadratlar boş deyilsə, oyun da başa çatır.
  • Oyun başa çatdıqda, daha çox hərəkət edilə bilməz.

Məhdudiyyətlər:

  • board.uzunluq == 3
  • lövhə[i].uzunluq == 3
  • board[i][j] ya 'X' , 'O', ya da ' '

Nümunələr və izahatlar

Misal 1:

Etibarlı Tic-Tac-Toe Dövlət LeetCode HəlliPin

Input: board = ["O  ","   ","   "]
Output: false
Explanation: The first player always plays "X".

Misal 2:

Etibarlı Tic-Tac-Toe Dövlət LeetCode HəlliPin

Input: board = ["XOX"," X ","   "]
Output: false
Explanation: Players take turns making moves.

Misal 3:

Etibarlı Tic-Tac-Toe Dövlət LeetCode HəlliPin

Input: board = ["XOX","O O","XOX"]
Output: true
Explanation: This state of game is achievable.

Yanaşma

Burada müzakirə olunan yanaşma kobud gücdür, kənar hallara diqqət yetirilərsə, onu həyata keçirmək asandır. Gəlin X işarəli oyunçuya, playerX işarəsinə və O işarəsi olan oyunçuya, playerO deyək. Biz bilirik ki, lövhədə 3 X işarəsi cərgə üzrə və ya düz-müdrik və ya diaqonal-müdrik və ya diaqonal-müdrik olaraq işarələnərsə, oyunçuX qazanır və buna bənzər şəkildə playerO da.

X və O-ların sayını saxlamaq üçün 3 ölçülü sətir və sütun dəyişənlərindən istifadə edəcəyik. i sətirində və j sütununda işarələnmiş hər X üçün biz sətirlərin[i] və sütunların[j] dəyərini 1 artıracağıq və işarələnmiş hər O üçün dəyəri 1 azaldacağıq. İzləmək üçün başqa diag və antiDiag dəyişənlərindən istifadə edin. diaqonal və anti-diaqonal işarələnmiş simvol. X işarələnibsə, 1 diaq artır, əks halda 1 diaq azalır.

Oyunçuların öz növbələrini şanslarına uyğun oynayıb-oynamadıqlarını bilmək üçün dəyişən növbəni saxlayın, X işarəsi qoyulduqda 1 artır, əks halda isə 1 azalır. playerX oyuna başladığı üçün növbənin dəyəri 0 və ya 1 ola bilər.

Sonra bütün lazımi şərtləri yoxlayacağıq -

  • yalnız bir oyunçu qalib gələ bilər
  • döndərmək == 0 və ya 1, yoxsa false qaytarın
  • playerX qalib gəlir, lakin ≠ 1 ⇒ döndərmək mümkün deyil
  • playerO qalib gəlir, lakin ≠ 0 ⇒ döndərmək mümkün deyil

Kodu

üçün C++ kodu Etibarlı Tic-Tac-Toe Dövləti

class Solution {
public:
    bool validTicTacToe(vector<string>& board) {
        int rows[3]={0,0,0}, cols[3]={0,0,0}, diag=0, antiDiag=0, turns=0;

        for(int i=0; i<3; i++) {
            for(int j=0; j<3; j++) {
                if(board[i][j] == 'X') {
                    rows[i]++;
                    cols[j]++;
                    if(i==j) diag++;
                    if(i+j == 2) antiDiag++;
                    turns++;
                }
                else if(board[i][j] == 'O') {
                    rows[i]--;
                    cols[j]--;
                    if(i==j) diag--;
                    if(i+j == 2) {
                        antiDiag--;
                    }
                    turns--;
                }
                
            }
        }
        
        bool Xwins = rows[0] == 3 || rows[1] == 3 || rows[2] == 3 || 
                cols[0] == 3 || cols[1] == 3 || cols[2] == 3 || 
                diag == 3 || antiDiag == 3;
        bool Owins = rows[0] == -3 || rows[1] == -3 || rows[2] == -3 || 
                cols[0] == -3 || cols[1] == -3 || cols[2] == -3 || 
                diag == -3 || antiDiag == -3;
        
        
        if ((Xwins && turns != 1) || (Owins && turns != 0)) return 0;
        if(Xwins && Owins) return 0;
        return (turns == 0 || turns == 1);
        
        
    }
};

Java kodu üçün Etibarlı Tic-Tac-Toe Dövləti

class Solution {
    public boolean validTicTacToe(String[] board) {
        int turns = 0;
        int[] rows = new int[3];
        int[] cols = new int[3];
        int diag = 0;
        int antiDiag = 0;
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (board[i].charAt(j) == 'X') {
                    turns++; 
                    rows[i]++; 
                    cols[j]++;
                    if (i == j) diag++;
                    if (i + j == 2) antiDiag++;
                } else if (board[i].charAt(j) == 'O') {
                    turns--; 
                    rows[i]--; 
                    cols[j]--;
                    if (i == j) diag--;
                    if (i + j == 2) antiDiag--;
                }
            }
        }
        
    boolean Xwins = false;
        Xwins = rows[0] == 3 || rows[1] == 3 || rows[2] == 3 || 
               cols[0] == 3 || cols[1] == 3 || cols[2] == 3 || 
               diag == 3 || antiDiag == 3;
        
        boolean Owins = false;
        Owins = rows[0] == -3 || rows[1] == -3 || rows[2] == -3 || 
               cols[0] == -3 || cols[1] == -3 || cols[2] == -3 || 
               diag == -3 || antiDiag == -3;
        
        if ((Xwins && turns != 1) || (Owins && turns != 0)) return false;
        if(Xwins && Owins) return false;
        return (turns == 0 || turns == 1);
    }
}

Etibarlı Tic-Tac-Toe Dövlət LeetCode Həlli üçün Mürəkkəblik Təhlili

Translate »