标题:九宫格源码(有砖请拍)
取消只看楼主
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
 问题点数:0 回复次数:5 
九宫格源码(有砖请拍)
#include <stdio.h>
int number[65][4];
int select[65];
int array[3][4];
int count;
int selecount;
int larray[1][65];
int lcount[1];
main()
{
   int i,k,flag,cc=0,i1,i3;
   printf("There are magic squares with invertable primes as follow:\n");
   for(i=123;i<=987;i++)
   {
      if(num(i))
      {
         number[count][0]=i;
         process(count++);
         select[selecount++]=count-1;
      }
   }
   larray[0][lcount[0]++]=number[0][0]/10;
   for(i=1;i<count;i++)
   {
      if(larray[0][lcount[0]-1]!=number[i][0]/10)
         larray[0][lcount[0]++]=number[i][0]/10;
      
   }
   for(i1=0;i1<selecount;i1++)
   {
      array[0][0]=select[i1];
      copy_num(0);
      for(array[1][0]=0;array[1][0]<count;array[1][0]++)
      {
         copy_num(1);
         if(!comp_num(2))
           continue;
         for(i3=0;i3<selecount;i3++)
         {
               array[2][0]=select[i3];
               copy_num(2);
               for(flag=1,i=1;flag&&i<=3;i++)
               {
                  if(!find1(i))
                    flag=0;
               }
               if(flag&&find2())
               {
                  printf("No.%d\n",++cc);
                  p_array();
               }
         }
      }
   }
}

num(int number)
{
   int i,j,k;
   i=number/100;
   j=number/10%10;
   k=number%10;
   if((i+j+k)==15&&i!=j&&i!=k&&j!=k)
      return 1;
   else
      return 0;
   
}

process(int i)
{
   int j,num;
   num=number[i][0];
   for(j=3;j>=1;j--,num/=10)
   {
      number[i][j]=num%10;
   }
}

copy_num(int i)
{
   int j;
   for(j=1;j<=3;j++)
   {
      array[i][j]=number[array[i][0]][j];
   }
}

comp_num(int n)
{
   static int ii;
   static int jj;
   int i,num,k,*p;
   int *pcount;
   pcount=&lcount[0];
   p=&ii;
   for(i=1;i<=3;i++)
   {
      for(num=0,k=0;k<n;k++)
      {
         num=num*10+array[k][i];
      }
      if(num<=larray[n-2][*p])
        for(;*p>=0&&num<larray[n-2][*p];(*p)--)
           ;
      else
        for(;*p<*pcount&&num>larray[n-2][*p];(*p)++)
           ;
      if(*p<0||*p>=*pcount)
      {
         *p=0;
         return 0;
      }
      if(num!=larray[n-2][*p])
        return 0;
   }
   return 1;
}

find1(int i)
{
   int num,j;
   for(num=0,j=0;j<3;j++)
   {
      num=num*10+array[j][i];
   }
   return find0(num);
}

find2(void)
{
   int num1,num2,j,i;
   for(num1=0,j=0;j<3;j++)
   {
      num1=num1*10+array[j][j+1];
   }
   for(num2=0,j=0,i=3;j<3;j++,i--)
   {
      num2=num2*10+array[j][i];
   }
   if(find0(num1))
     return find0(num2);
   else
     return 0;
}

find0(int num)
{
   static int j;
   if(num<=number[j][0])
     for(;j>=0&&num<number[j][0];j--)
        ;
   else
     for(;j<count&&num>number[j][0];j++)
        ;
   if(j<0||j>=count)
   {
      j=0;
      return 0;
   }
   if(num==number[j][0])
     return 1;
   else
     return 0;
}

p_array(void)
{
   int i,j;
   for(i=0;i<3;i++)
   {
      for(j=1;j<=3;j++)
      {
         printf("%6d",array[i][j]);
      }
      printf("\n");
   }
}

程序的技巧在于尽早发现矛盾  减少循环次数

用九重循环解 得循环9^9  
现在只要循环9^3

[[it] 本帖最后由 liyanhong 于 2008-10-8 10:15 编辑 [/it]]
搜索更多相关主题的帖子: 九宫 源码 
2008-08-27 20:40
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
[bo][un]benniey[/un] 在 2008-8-28 18:49 的发言:[/bo]

能问一下 , 这个是干什么用的 ?

将1-9这九个数字填入九宫格中,横竖斜的和是15。解了九宫格,还有口诀:戴九履一,左三右七,二四为肩,六八为足。
□□□
□□□
□□□

PS:不是吧  我用TC和VC都可以运行通过的哈

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-08 07:34
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
是麻烦了一点
 学习了哈

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-08 07:39
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
我不是已经解决了吗  还找以前的干吗

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-08 07:46
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
我以前还对我自己的这个很满意呢
呵  见识了哈

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-08 07:51
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
不才哈

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-08 12:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-230168-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.178750 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved