首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求大神帮小弟我看下代码错哪了阿

2013-06-25 
求大神帮我看下代码哪里错了阿题目是一个九宫格,要求1到9的数不能重复横竖对角线相加均为15.我是新手,头都

求大神帮我看下代码哪里错了阿
题目是一个九宫格,要求1到9的数不能重复横竖对角线相加均为15.我是新手,头都大了,求大神解决下吧,万分感谢哦!下面是我的代码:
#include<stdio.h>
int main()
{
 int arr[3][3];
 
 int i,j;
for(i=0;i<=2;i++)
 {
  for(j=0;j<=2;j++)
  {   
      printf("请输入数字:\n"); 
   scanf("%d",&arr[i][j]);
   if(arr[i][j]>9||arr[i][j]==0)
   printf("输入错误");
   goto SD;
  }
 }
 for(i=0;i<=2;i++)
 {
  for(j=0;j<=2;j++)
  {
      if(arr[0][0]+arr[0][1]+arr[0][2]==15&&arr[1][0]+arr[1][1]+arr[1][2]==15&&arr[2][0]+arr[2][1]+arr[2][2]==15&&arr[0][0]+arr[1][0]+arr[2][0]==15&&arr[0][1]+arr[1][1]+arr[2][1]==15&&arr[0][2]+arr[1][2]+arr[2][2]==15&&arr[0][0]+arr[1][1]+arr[2][2]==15&&arr[2][0]+arr[2][2]+arr[0][2]==15)
printf("%3d",arr[i][j]);
   else
   printf("输入错误,请重新输入:\n") ; 
   goto SD;
  }
  printf("\n");
 }
 SD:
 for(i=0;i<=2;i++)
 {
  for(j=0;j<=2;j++)
  {   
      printf("请输入数字:\n"); 
   scanf("%d",&arr[i][j]);
  }
 }
return 0;
} 九宫格
[解决办法]
单步调试和设断点调试是程序员必须掌握的技能之一。

[解决办法]
这个怎么能用暴力呢,首先分析一下这个9宫格的结构吧。
设符合条件的解以行优先来排列,数据为a b c d e f g h i。
注意符合条件的解旋转90度之后仍然符合条件,根据堆称轴翻转也是符合条件的。所以我们可以简化讨论,后面再说。
根据条件2*(b+d+f+h)+3*(a+c+g+i)+4*e=120;
又因为a+b+c+d+e+f+g+h+i=45
所以(a+c+g+i)+2*e=30
这时还要观察到对于最中间的元素e,有两条对角线和一条竖线和一条横线过这个点。
所以(a+b+c+d+f+g+h+i)+4*e=60。
所以e是5,因此a+c+g+i=20,a+i=10,c+g=10,b+h=10,d+f=10
因此我们可以划分为4对(1,9) (2,8) (3,7) (4,6)
这个时候我们再假设 a为1,或者 b为1.然后再进行下面的讨论 。因为对于1,他的位置总是可以通过旋转或对称变换转移到a或者b上 。
假设a为1,则 i为9。此时g+h+i=15所以g+h=6。这时符合条件的对只有(2,4),因为(1,5)不可能了。
如果 g为2,则d为12,不符合条件,如果g为4,则d为10,也不符合条件 。
所以原假设错误,b才是1.这时h为9,而(g,i)为(2,4)或者(4,2),因为是轴对称的,所以两种情况都存在,知道一种情况后,直接轴堆成就可以得到另外一种。
不妨假设为 (2,4),这时a+d=13,a+c=14,a+i=10,所以a=6
因此此时的排列为 6,1,8,7,5,3,2,9,4
根据这个原始的排列,自己去旋转,就可以得到其他的解了 。
[解决办法]
参阅 射雕英雄传 黄容求医遇瑛姑一节

热点排行