井字棋,判断后手者是否存在任意三个标记形成一条直线,哪里不对?

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。(来自百度百科)

请你判断后手者是否存在任意三个标记形成一条直线?

输入格式:
第一行输入一个整数t(1<=t<=1000)代表t组输入。接下来每组输入一个井字棋游戏局面。

输出格式:
若后手者存在任意三个标记形成一条直线输出"yes",否则输出"no"。


#include <iostream>
using namespace std;
void Judgegame(char str[3][3])
{
    int i,sum=0;
    for(i=0;i<3;i++)
    {
        if(str[i][0]=='O')
        {
            if((str[i][0]==str[i][1])&&(str[i][1]==str[i][2]))
            {
                cout<<"yes"<<endl;
                sum++;
                break;
            }
        }
    }
    for(i=0;i<3;i++)
    {
        if(str[0][i]=='O')
        {
            if((str[0][i]==str[1][i])&&(str[1][i]==str[2][i]))
            {
                cout<<"yes"<<endl;
                sum++;
                break;
            }
        }
    }
    if(str[1][1]=='O')
    {
        if(((str[0][0]==str[1][1])&&(str[1][1]==str[2][2]))||((str[0][2]==str[1][1])&&(str[1][1]==str[2][0])))
        {
            cout<<"yes"<<endl;
            sum++;
        }
    }
    if(sum==0)
    {
        cout<<"no"<<endl;
    }
}
int main()
{
    int t,i,j,k;
    char a[3][3];
    cin>>t;
    for(i=1;i<=t;i++)
    {
        for(j=0;j<3;j++)
        {
            for(k=0;k<3;k++)
            {
                cin>>a[j][k];
            }
        }
        cout<<endl;
        Judgegame(a);
    }
    return 0;
}

我重新打一个你能给我采纳嘛?


求采纳

#include<bits/stdc++.h>
using namespace std;
int a[4][4];
int s[8]={1,1,1,1,1,1,1,1};
bool pand()
{
    
    for(int i=1;i<=3;i++)
    {
        if(!a[i][1]) s[1]=0;
        if(!a[1][i]) s[2]=0;
        if(!a[i][i]) s[3]=0;
        if(!a[i][3]) s[4]=0;
        if(!a[3][i]) s[5]=0;
        if(!a[i][4-i]) s[6]=0;
    }//共六种情况 
    for(int i=1;i<=6;i++)
        if(s[i]==1) return 1;
    return 0;
    
}
int main()
{
    int t
    cin>>t;
    while(t>0)
    {
        for(int i=1;i<=3;i++)
        {
            for(int j=1;j<=3;j++)
            {
                char c;
                cin>>c;
                if(c=='O') a[i][j]=1;
                else a[i][j]=0;
            }
        }
        if(pand()) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
        t--;
    }
}

判断同一行三个字符是否相同,只要字符数组第i行的[i][0],[i][1],[i][2]三个相等就可以。
同理,
列,i列[0][i],[1][i],[2][i]
斜对角:[0][0],[1][1],[2][2]
[0][2],[1][1],[2][0]


1.
#include<iostream>
#include<cstdio>
using namespace std;

int a[4][4]; 
int main()
{
    int t;
    char ch;
    scanf("%d",&t);
//    scanf("\n");
    while(t--)
    {   
        int flag=0;
        for(int i=0;i<3;i++)
        { 
            scanf("\n"); 
            for(int j=0;j<3;j++)
            {    
                ch=getchar(); 
                if(ch=='O') a[i][j]=1;
                else a[i][j]=0;
            }
            
        }
//        scanf("\n");
        for(int i=0;i<3;i++)
        {
        if(a[i][0]+a[i][1]+a[i][2]==3) cout<<"yes"<<endl;
            flag=1;
        break;
    }
        for(int i=0;i<3;i++)
        if(a[0][i]+a[1][i]+a[2][i]==3) 
        {cout<<"yes"<<endl;flag=1;}
        if(a[0][0]+a[1][1]+a[2][2]==3) {cout<<"yes"<<endl;flag=1;}
        if(a[2][0]+a[1][1]+a[0][2]==3){ cout<<"yes"<<endl;flag=1;}
        if(flag=0)cout<<"no"<<endl;
   }
    
    return 0;
}