Tic Tac Toe

编程基础——函数调用

1.3:Tic Tac Toe

题目:
输入
• 输入的第一行给出N,表示测试用例的数目。然后给出
4N-1行,说明N个用空行分隔的网格图。
输出
• 对于每个测试用例,在一行中输出"yes"或"no",表示该
网格图是否是有效的三连棋游戏的一个步骤。

试题分析:
在这里插入图片描述
有效的三连棋一定满足如下特征:
•o的数量一定<=x的数量
•如果x的数量比o的数量多1,那么不可能o赢
•如果x和o的数量相等,则不可能是x赢。
调用fact函数判断是谁赢并返回相应的类型
根据说给的特征进行执行

注意点:
•c语言不可以返回bool类型
•三目运算符比if语句更简单
t=fact(t)?1:0 ——t是否返回相应的类型,如果是t=1,否则t=0;
二维数组可以将一维数组看成是字符串

样例:
Sample Input
2
X.O
OO.
XXX
O.X
XX.
OOO
Sample Output
yes
no

c

#include <stdio.h>
char a[3][3];
int fact(char c){//调用函数实现赢的情况 
	int i;
	for(i=0;i<3;++i){
		if(a[0][i]==c){
			if(a[1][i]==c&&a[2][i]==c) return 1;//竖排相同 
		}
	}
	for(i=0;i<3;++i){
		if(a[i][0]==c){
			if(a[i][1]==c&&a[i][2]==c) return 1;//横排相同 
		}
    }
    if(a[0][0]==c&&a[1][1]==c&&a[2][2]==c) return 1;//两条对角线相同 
    if(a[2][0]==c&&a[1][1]==c&&a[0][2]==c) return 1;
    return 0;
}
int main () {
	int k;
	scanf("%d",&k);
	while(k--){
		int i,j,t=0,m=0,n=0;
	    for(i=0;i<3;++i) {//将二维数组以一维看成一个字符串 
			scanf("%s",a[i]);
	    }
	    for(i=0;i<3;++i){
		    for(j=0;j<3;++j){
			    if(a[i][j]=='X') m++;//统计每个测试用例x,o的数量 
			    else if(a[i][j]=='O') n++; 
		    }
	    }
	    if(m>=n){
		    if(m==n){
			    t=fact('X')==1?0:1;//1为有效,0为无效 
		     }
		    else if(m-n==1){
			    t==fact('O')==1?0:1;
		    }
		    else t=0;
	    }
	    else t=0;//每次结束后初始化变量 
	    printf("%s\n",t==1?"yes":"no");//三目运算符 
	}
	return 0;
} 

c++

#include <stdio.h> 
char mp[3][3]; 
int x, o; 
int flag; 
char cal(char tar) { 
    for (int i = 0; i < 3; ++i) { 
        if (mp[0][i] == tar) { 
            if (mp[1][i]==tar && mp[2][i]==tar) { 
			    return true; 
			} 
        } 
    }
    for (int i = 0; i < 3; ++i) { 
        if (mp[i][0] == tar) { 
            if (mp[i][1]==tar && mp[i][2]==tar) { 
                    return true; 
				} 
            } 
    }
    if (mp[0][0]==tar && mp[1][1]==tar && mp[2][2]==tar) { 
        return true; }
    if (mp[0][2]==tar && mp[1][1]==tar && mp[2][0]==tar) { 
        return true; }
    return false; 
}
    int main() { 
        int n; 
		scanf("%d",&n); 
        while (n--) { 
            flag = x = o = 0; 
            for (int i = 0; i < 3; ++i) { 
                scanf("%s", mp[i]); }
            for (int i = 0; i < 3; ++i) { 
                for (int j = 0; j < 3; ++j) { 
                    if (mp[i][j] == 'X') { 
                        x++; }
                    else if (mp[i][j] == 'O') { 
					    o++; } 
				} 
			}
            if (x >= o) { 
                if (x == o) {
                    flag = cal('X') ? 0 : 1; }
                else if (x - o == 1) { 
                    flag = cal('O') ? 0 : 1; }
                else 
				    {flag = 0; 
				} 
			}
            else {flag = 0; 
		    }
            printf("%s\n", flag==1 ? "yes" : "no"); }
        return 0; 
	}