蓝桥杯的一道简单的暴力省赛题
解题思路无非是将幻方每一种情况都列出来,然后一一遍历比较,最后输出结果即可
上代码
#include<stdio.h>
#include<math.h>
int main ()
{
//初始化
int arr[8][9]={
{4,9,2,3,5,7,8,1,6},
{8,3,4,1,5,9,6,7,2},
{6,1,8,7,5,3,2,9,4},
{2,7,6,9,5,1,4,3,8},
{4,3,8,9,5,1,2,7,6},
{8,1,6,3,5,7,4,9,2},
{6,7,2,1,5,9,8,3,4},
{2,9,4,7,5,3,6,1,8},
};
int a[9],b[9];
int i,j,cnt=0,sum=0;
for (i=0;i<9;i++)
{
scanf("%d",&a[i]);
if(a[i]!=0)
{
cnt++;
}
}
//暴力遍历
int tmp=0;
for(i=0;i<8;i++)
{
for(j=0,tmp=0;j<9;j++)
{
if(a[j]!=0&&a[j]==arr[i][j])
{
tmp++;
}
}
if(tmp==cnt)
{
sum++;
int k=0;
for(;k<9&&sum<=1;k++)
{
b[k]=arr[i][k];//*1 这里记得不能直接用a[k],否则会影响下一次遍历
}
}
}
//判断输出
if(sum==1)
{
for(j=1;j<=9;j++)
{
printf("%d ",b[j-1]);
if(j%3==0&&j!=9)
{
printf("\n");
}
}
}
else
{
printf("Too Many");
}
return 0;
}
一些错的小细节:在*1 中,我一开始使用了a[k],导致下一次判断时原数组被修改,tmp==cnt 这个条件不再有意义。