标题:九宫格源码(有砖请拍)
只看楼主
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
 问题点数:0 回复次数:17 
九宫格源码(有砖请拍)
#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
benniey
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-8-3
得分:0 
能问一下 , 这个是干什么用的 ?
2008-08-28 18:49
mdc8678361
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-9-30
得分:0 
算法!
2008-09-30 12:46
小小熊宝宝
Rank: 2
来 自:江苏无锡
等 级:论坛游民
威 望:2
帖 子:183
专家分:38
注 册:2008-8-12
得分:0 
--------------------Configuration: 7 - Win32 Debug--------------------
Compiling...
7.cpp
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(15) : error C2065: 'num' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(18) : error C2065: 'process' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(31) : error C2065: 'copy_num' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(35) : error C2065: 'comp_num' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(43) : error C2065: 'find1' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(46) : error C2065: 'find2' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(49) : error C2065: 'p_array' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(56) : error C2373: 'num' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(67) : error C2373: 'process' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(74) : warning C4508: 'process' : function should return a value; 'void' return type assumed
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(76) : error C2373: 'copy_num' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(82) : warning C4508: 'copy_num' : function should return a value; 'void' return type assumed
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(84) : error C2373: 'comp_num' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(114) : error C2373: 'find1' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(120) : error C2065: 'find0' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(123) : error C2373: 'find2' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(139) : error C2373: 'find0' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(158) : error C2373: 'p_array' : redefinition; different type modifiers
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\7.cpp(168) : warning C4508: 'p_array' : function should return a value; 'void' return type assumed
执行 cl.exe 时出错.

7.obj - 1 error(s), 0 warning(s)

欢迎加入C语言交流群:43287755
2008-09-30 16:53
d7d7
Rank: 4
等 级:业余侠客
帖 子:91
专家分:210
注 册:2008-9-29
得分:0 
q我也用过了,不过 不有得到答案
2008-09-30 16:59
HAN2008
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2008-9-21
得分:0 
看的大吃一惊
2008-10-01 09:17
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
得分:0 
[bo][un]HAN2008[/un] 在 2008-10-1 09:17 的发言:[/bo]

看的大吃一惊



枉你的目标这么大啊!!

悲剧源于生活。
2008-10-01 12:04
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
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
得分:0 
我晕倒,就填个9宫也这么麻烦。。。早就有能填99的了
#define N 3
#include<stdio.h>
void main()
{
int a[N][N],i,j,k;
for(i=0;i<N;i++) /*先处理第一行*/
for(j=0;j<N;j++)
{
a[i][j]=0; /*先令所有元素都为0*/
}
j=(N-1)/2; /*判断j的位置*/
a[0][j]=1; /*将1放在第一行中间一列*/
for(k=2;k<=N*N;k++) /*再从2开始处理*/
{
i=i-1; /*存放的行比前一个数的行数减1*/
j=j+1; /*存放的列比前一个数的列数加1*/
if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
else
{
if(i<0) /*当行数减到第一行,返回到最后一行*/
i=N-1;
if(j>N-1) /*当列数加到最后一行,返回到第一行*/
j=0;
}
if(a[i][j]==0) /*如果该元素为0,继续执行程序*/
a[i][j]=k;
else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=0;i<N;i++) /*输出数组*/
{
for(j=0;j<N;j++)
printf(\"%5d\",a[i][j]);
printf(\"\\n\\n\");
}
}
方法二:

/*这个是网友qfyzy为帮助我找错而提供的,可以算到99阶*/
#define N 7
#include<stdio.h>
void main()
{
int a[N][N]={0},i=0,j,k; /*先令所有元素都为0*/
j=(N-1)/2;
i=0;
for(k=1;k<=N*N;) /*开始处理*/
{
if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
else if(i<0) /*当行数减到第一行,返回到最后一行*/
i=N-1;
else if(j>N-1) /*当列数加到最后一行,返回到第一行*/
j=0;
else if(!a[i][j]){ /*如果该元素为0,继续执行程序*/
a[i][j]=k++;
i=i-1;
j=j+1;
}
else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
}
for(i=0;i<N;i++) /*输出数组*/
{
for(j=0;j<N;j++)
printf(\"%5d\",a[i][j]);
printf(\"\\n\\n\");
}
}

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-10-08 07:37
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
是麻烦了一点
 学习了哈

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



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




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

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