题目描述
在九宫格里面填上1~9九个数字,每个格内的数字不能相同,目前已经填上了6个数字,要求你填上剩下3个数字
1 | 8 | |
7 | 5 | |
2 | 4 |
问:能否有一种填法,在缺失数字的空格填上数字后,使得任一行(注意只要求行)上的三个数之和都是奇数?
输入格式
3行,每行3个数字,以空格分隔,还没有填上数字的位置填0表示
输出格式
Y或者N
输入样例
8 2 0
4 0 6
7 0 9
输出样例
Y
【提示:从上到下的空位依次填上1,3,5即可提交】
话不多说直接上代码:
#include <stdio.h>
typedef struct node
{
int x;
int y;
}node;
int main()
{
//矩阵
int a[3][3];
//未填写的数字和坐标
int leftNum[3];
node leftXY[3];
//散列表
int num[9]={0};
//行的和
int sum;
//计数器
int count=0;
//奇偶数计数器
int isBin1=0,notBin1=0;
//未填写的数中奇偶数个数
int isBin2=0,notBin2=0;
//输入和在线处理
for(int i=0;i<3;++i)
{
sum=0;
for(int j=0;j<3;++j)
{
scanf("%d",&a[i][j]);
//更新行和
sum+=a[i][j];
//更新散列表
num[a[i][j]-1]=1;
//更新未填写的坐标
if(!a[i][j])
{
leftXY[count].x=i;
leftXY[count].y=j;
count++;
}
}
//统计奇偶数个数
if(sum%2==0) isBin1++;
else notBin1++;
}
//重置计数器
count=0;
//取出未填写数
for(int i=0;i<9;++i)
{
if(!num[i])
{
//更新未填写数
leftNum[count++]=i+1;
//更新未填写的数中奇偶数个数
if((i+1)%2==0) isBin2++;
else notBin2++;
}
}
//若行和奇数的个数等于未填写数偶数的个数
//且若行和偶数的个数等于未填写数奇数的个数
//即存在满足要求的
if(isBin1==notBin2 && notBin1==isBin2) printf("Y");
else printf("N");
return 0;
}
思路很简单,就是看没填数字前每行的和有几个奇数,几个偶数,然后看没填的数字里有几个奇数,几个偶数
易知奇数+奇数=偶数;奇数+偶数=奇数
所以要满足任一行的和为奇数,那么未填数字前行的和有多少个奇数,未填的数字就要有多少个偶数,偶数同理。