博主不定期更新【保研/推免、C/C++、5G移动通信、Linux、生活随笔】系列文章,喜欢的朋友【点赞+关注】支持一下吧!
读入一个3×3矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示该位置上有一个O,要求编写程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜。
本游戏获胜是指在同一行、同一列或同一对角线上,有三个相同字符。
代码如下:
#include <stdio.h>
int main()
{
//定义变量
const int size = 3;
int board[size][size];
int i, j;
int numofXr, numofOr; //numofXr表示同一行row中X的个数, numofOr表示同一行中O的个数
int numofXc, numofOc; //numofXc表示同一列column中X的个数, numofOc示同一列中O的个数
int numofXd1, numofOd1, numofXd2, numofOd2; //numofXd表示对角线diagonal上X的个数, numofOd表示对角线上O的个数,d1表示主对角线,d2表示次对角线
int result = -1; // -1表示没人赢,1表示X赢,0表示O赢
//读入矩阵
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
scanf("%d", &board[i][j]);
}
}
//判断行和列
for (i=0; i<size && result==-1; i++)
{
numofXr = numofOr = numofXc = numofOc = 0;
for (j=0; j<size; j++)
{
//判断行
if (board[i][j] == 1)
{
numofXr++;
}
else
{
numofOr++;
}
//判断列
if (board[j][i] == 1)
{
numofXc++;
}
else
{
numofOc++;
}
}
if (numofXr == size || numofXc == size)
{
result = 1;
}
else if (numofOr == size || numofOc == size)
{
result = 0;
}
}
//判断对角线
numofXd1 = numofOd1 = numofXd2 = numofOd2 = 0; //此处初始化值需要在循环外面,而在判断行与列时初始化在循环里面,注意区分。
for (i=0; i<size && result==-1; i++)
{
if (board[i][i] == 1)
{
numofXd1++;
}
else
{
numofOd1++;
}
if (board[i][size-i-1] == 1)
{
numofXd2++;
}
else
{
numofOd2++;
}
}
if (numofXd1 == size || numofXd2 == size)
{
result = 1;
}
else if (numofOd1 == size || numofOd2 == size)
{
result = 0;
}
//输出结果
switch (result)
{
case -1:
printf("没有人赢\n");
break;
case 0:
printf("O\n");
break;
case 1:
printf("X\n");
break;
default:
printf("Error!\n");
break;
}
return 0;
}
此程序编写过程中需注意以下几点:
1.数组初始化 例如:int board[3][3]={1,0,1,0,1,0,0,0,1}; 在定义数组时给数组初始化称为数组的集成初始化,以上方式初始化只能在定义数组时(且数组定义中不能含有变量如board[size][size]),如果定义时没有给数组初始化(或者定义数组时使用了变量),则初始化数组只能通过遍历用for循环来实现;
常见错误及正确初始化方式:
//常见错误1
int a[3][3];
a[3][3] = {1,0,1,0,1,0,0,0,1};
//常见错误2
int size = 3;
int a[size][size] = {1,0,1,0,1,0,0,0,1};
//正确初始化1
int a[3][3] = {1,0,1,0,1,0,0,0,1};
//正确初始化2
int size = 3;
int a[size][size]; //以上两句也可以是 int a[3][3];
for (i=0, i<size, i++)
{
for (j=0, j<size, j++)
{
a[i][j]=i*j;
}
}
2.由于矩阵是3×3矩阵,因此判断行与列时,只是下标i与j的互换,因此可以利用矩阵下标的对称性简化程序,将行、列放在一个循环中判断即可。
3.在判断行列与判断对角线上是否有三个同样的符号时,需要注意,判断行列时是逐行或逐列判断,而判断对角线是整个矩阵只判断一次,因此,计数值初始化位置不同,前者需放在循环内,每次循环重新至0,后者需放在循环外。