Skip to content

Commit e38e30e

Browse files
authored
Improved task 794.
1 parent 5a94cbd commit e38e30e

File tree

1 file changed

+52
-55
lines changed
  • src/main/java/g0701_0800/s0794_valid_tic_tac_toe_state

1 file changed

+52
-55
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,63 @@
11
package g0701_0800.s0794_valid_tic_tac_toe_state;
22

3-
// #Medium #Array #String #2022_03_26_Time_0_ms_(100.00%)_Space_42.1_MB_(13.47%)
3+
// #Medium #Array #String #2022_03_30_Time_0_ms_(100.00%)_Space_39.6_MB_(91.75%)
44

55
public class Solution {
66
public boolean validTicTacToe(String[] board) {
7-
int cO = 0;
8-
int cX = 0;
9-
for (int x = 0; x < 3; x++) {
10-
for (int y = 0; y < 3; y++) {
11-
char ch = board[x].charAt(y);
12-
if (ch == 'O') {
13-
cO++;
14-
} else if (ch == 'X') {
15-
cX++;
7+
// X=1,O=-1,’ ’=0
8+
int sum = 0;
9+
int[] winsCol = new int[3];
10+
int[] winsDiag = new int[2];
11+
boolean xWin = false;
12+
boolean oWin = false;
13+
for (int i = 0; i < 3; i++) {
14+
String str = board[i];
15+
int rowSum = 0;
16+
for (int j = 0; j < 3; j++) {
17+
// char chr=str.toCharArray()[j];
18+
int intchr = 0;
19+
if (str.toCharArray()[j] == 'X') {
20+
intchr = 1;
1621
}
22+
if (str.toCharArray()[j] == 'O') {
23+
intchr = -1;
24+
}
25+
rowSum += intchr;
26+
winsCol[j] += intchr;
27+
if (i == 2 && winsCol[j] == 3) {
28+
xWin = true;
29+
}
30+
if (i == 2 && winsCol[j] == -3) {
31+
oWin = true;
32+
}
33+
if (Math.abs(i - j) != 1) {
34+
if (i == j && i == 1) {
35+
winsDiag[0] += intchr;
36+
winsDiag[1] += intchr;
37+
} else if (i == j) {
38+
winsDiag[0] += intchr;
39+
} else {
40+
winsDiag[1] += intchr;
41+
}
42+
}
43+
if (i == 2 && Math.max(winsDiag[0], winsDiag[1]) == 3) {
44+
xWin = true;
45+
}
46+
if (i == 2 && Math.min(winsDiag[0], winsDiag[1]) == -3) {
47+
oWin = true;
48+
}
49+
}
50+
if (rowSum == 3) {
51+
xWin = true;
1752
}
53+
if (rowSum == -3) {
54+
oWin = true;
55+
}
56+
sum += rowSum;
1857
}
19-
char a1 = board[0].charAt(0);
20-
char a2 = board[0].charAt(1);
21-
char a3 = board[0].charAt(2);
22-
char a4 = board[1].charAt(0);
23-
char a5 = board[1].charAt(1);
24-
char a6 = board[1].charAt(2);
25-
char a7 = board[2].charAt(0);
26-
char a8 = board[2].charAt(1);
27-
char a9 = board[2].charAt(2);
28-
// The main thing here is we just need to check if the given sequence is possible or not.
29-
// We dont need to find any winner. *Logic is the one who has last chance can be in 1 row,
30-
// column(horizontally,vertically or diagonally) not the other one.
31-
// So few cases will arise
32-
// 1) Count of 'X' is 1 more than count of 'O'-> Only X can win and 'O' cannot win (Last
33-
// Chance is with X so only X can win)
34-
// 2) Count of 'X' is equal to count of 'O' -> Only 'O' can win and 'X' cannot win(Check
35-
// few cases)(Last Chance is with 'O' so only 'O' can win)
36-
// 3) return false (rest all are invalid case)
37-
38-
// Eg - if X=4 and O=3 (ie Count of 'O' is 1 less) then 'O' cannot win and
39-
// if we find such a case then we need to return false else the sequence is fine(try
40-
// yourself & see)
41-
if ((cX - 1) == cO) {
42-
// These are all horizaontal, vertical, diagonal
43-
return (a1 != a2 || a2 != a3 || a1 != 'O')
44-
&& (a4 != a5 || a5 != a6 || a4 != 'O')
45-
&& (a7 != a8 || a8 != a9 || a7 != 'O')
46-
&& (a1 != a5 || a5 != a9 || a1 != 'O')
47-
&& (a3 != a5 || a5 != a7 || a3 != 'O')
48-
&& (a1 != a4 || a4 != a7 || a1 != 'O')
49-
&& (a2 != a5 || a5 != a8 || a2 != 'O')
50-
&& (a3 != a6 || a6 != a9 || a3 != 'O');
51-
} else if (cX == cO) {
52-
// if X=4 and O=4 (ie both r equal) then 'X' cannot win amd
53-
// if we find such a case then we need to return false else the sequence is fine(try
54-
// yourself & see)
55-
return (a1 != a2 || a2 != a3 || a1 != 'X')
56-
&& (a4 != a5 || a5 != a6 || a4 != 'X')
57-
&& (a7 != a8 || a8 != a9 || a7 != 'X')
58-
&& (a1 != a5 || a5 != a9 || a1 != 'X')
59-
&& (a3 != a5 || a5 != a7 || a3 != 'X')
60-
&& (a1 != a4 || a4 != a7 || a1 != 'X')
61-
&& (a2 != a5 || a5 != a8 || a2 != 'X')
62-
&& (a3 != a6 || a6 != a9 || a3 != 'X');
58+
if (sum == 0 && !xWin) {
59+
return true;
6360
}
64-
return false;
61+
return sum == 1 && !oWin;
6562
}
6663
}

0 commit comments

Comments
 (0)