| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 668 人关注过本帖
标题:九宫格源码(有砖请拍)
收藏  订阅  推荐  打印 
liyanhong
Rank: 3Rank: 3
来自:水星
等级:中级会员
威望:8
帖子:1865
积分:4532
注册:2008-5-3
九宫格源码(有砖请拍)

#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

[ 本帖最后由 liyanhong 于 2008-10-8 10:15 编辑 ]
搜索更多相关主题的帖子: 九宫  源码  
2008-8-27 20:40
benniey
Rank: 1
等级:新手上路
帖子:3
积分:128
注册:2008-8-3

能问一下 , 这个是干什么用的 ?
2008-8-28 18:49
mdc8678361
Rank: 1
等级:新手上路
帖子:2
积分:120
注册:2008-9-30

算法!
2008-9-30 12:46
小小熊宝宝
Rank: 2
来自:江苏无锡
等级:注册会员
威望:2
帖子:145
积分:1754
注册:2008-8-12

--------------------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)

困难越多越好,只有克服困难才会走向成功!
2008-9-30 16:53
d7d7
Rank: 1
等级:新手上路
帖子:9
积分:194
注册:2008-9-29

q我也用过了,不过 不有得到答案
2008-9-30 16:59
HAN2008
Rank: 2
等级:注册会员
帖子:52
积分:584
注册:2008-9-21

看的大吃一惊
2008-10-1 09:17
zdyzhang
Rank: 2
等级:注册会员
帖子:172
积分:1668
注册:2008-9-20

HAN2008 在 2008-10-1 09:17 的发言:

看的大吃一惊
枉你的目标这么大啊!!

C语言QQ群邀请高手来解疑,谢谢27292609 多C多漂亮,CC我的生活!
2008-10-1 12:04
liyanhong
Rank: 3Rank: 3
来自:水星
等级:中级会员
威望:8
帖子:1865
积分:4532
注册:2008-5-3

benniey 在 2008-8-28 18:49 的发言:

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

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

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-8 07:34
qfyzy
Rank: 3Rank: 3
来自:安徽合肥
等级:中级会员
威望:1
帖子:344
积分:3728
注册:2008-2-17

我晕倒,就填个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-8 07:37
liyanhong
Rank: 3Rank: 3
来自:水星
等级:中级会员
威望:8
帖子:1865
积分:4532
注册:2008-5-3

是麻烦了一点
学习了哈

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-8 07:39
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.056922 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved