九宫格源码(有砖请拍)
#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=ⅈ
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]]