L - Tic-Tac-Toe FZU - 2283 (思维)
题目链接:
L - Tic-Tac-Toe
题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否获胜?(获胜的前提,其中一个人的三个棋子连成了一条线)。
参考博客:
Tic-Tac-Toe FZU - 2283 (暴力) - CSDN博客
具体思路:首先必胜态一共有两种情况,一行一共有三个,存在一行有两个是第一个人的棋子,另外一个是空格,这种情况下第一个人必胜。
第二个情况,存在相交的两行,这两行都满足有一个是第一个人的棋子,剩余的两个为空格,这样也是满足的。
AC代码:
1 #include<iostream> 2 #include<string> 3 #include<stdio.h> 4 using namespace std; 5 # define ll long long 6 # define inf 0x3f3f3f3f 7 const int maxn =2e5+100; 8 char a[5][5]; 9 char u; 10 bool judge(int x,int y) 11 { 12 int flag1=0,flag2=0; 13 int t1=0, t2=0; 14 for(int i=1; i<=3; i++) 15 { 16 if(a[x][i]=='.') 17 t1++; 18 if(a[x][i]==u) 19 t2++; 20 } 21 if(t1==1&&t2==2) 22 flag1++; 23 if(t1==2&&t2==1) 24 flag2++; 25 t1=0,t2=0; 26 for(int i=1; i<=3; i++) 27 { 28 if(a[i][y]=='.') 29 t1++; 30 if(a[i][y]==u) 31 t2++; 32 } 33 if(t1==1&&t2==2) 34 flag1++; 35 if(t1==2&&t2==1) 36 flag2++; 37 if(x==y) 38 { 39 t1=0,t2=0; 40 for(int i=1; i<=3; i++) 41 { 42 if(a[i][i]=='.') 43 t1++; 44 if(a[i][i]==u) 45 t2++; 46 } 47 if(t1==1&&t2==2) 48 flag1++; 49 if(t1==2&&t2==1) 50 flag2++; 51 } 52 if(x+y==4) 53 { 54 t1=0,t2=0; 55 for(int i=1; i<=3; i++) 56 { 57 if(a[i][3+1-i]=='.') 58 t1++; 59 if(a[i][4-i]==u) 60 t2++; 61 } 62 if(t1==1&&t2==2) 63 flag1++; 64 if(t1==2&&t2==1) 65 flag2++; 66 } 67 return flag1>=1|| flag2>=2; 68 } 69 int main() 70 { 71 int T; 72 scanf("%d",&T); 73 while(T--) 74 { 75 for(int i=1; i<=3; i++) 76 { 77 for(int j=1; j<=3; j++) 78 { 79 scanf(" %c",&a[i][j]); 80 } 81 } 82 int flag=0; 83 scanf(" %c",&u); 84 for(int i=1; i<=3; i++) 85 { 86 for(int j=1; j<=3; j++) 87 { 88 if(judge(i,j)) 89 { 90 flag=1; 91 break; 92 } 93 } 94 if(flag) 95 break; 96 } 97 if(flag) 98 printf("Kim win!\n"); 99 else 100 printf("Cannot win!\n"); 101 } 102 return 0; 103 }