首页
社区
课程
招聘
[郁闷]绝无抄袭,绝无更改,全部复制
发表于: 2010-10-22 11:37 4593

[郁闷]绝无抄袭,绝无更改,全部复制

2010-10-22 11:37
4593
从前天12点15发了第二题后,我就占楼看题。直到今天看了不少关于幻方代码,也学到不少东西,但写不出呀写不出。也罢,参与就好。下面的代码绝无抄袭,绝无更改,全部复制,如果雷同,必须地。。。。

#include   <stdio.h>

int   p[100][4],l=0,t=0;
int   q[4],p4[30][4];
long   total=0;
int   board[4][4];
unsigned   long   s[100];

void   finalJudge()
{
int   i,j,k,m,x,y;
for   (i=0;i <24;i++)
{
for   (j=0;j <24;j++)
{
for   (k=0,x=0,y=0;k <4;k++)
{
x+=board[p4[i][k]][p4[j][k]];
y+=board[p4[i][3-k]][p4[j][k]];
}
if   (x==34   &&   y==34)
{
total++;
for   (k=0;k <4;k++,printf( "\n "))
for   (m=0;m <4;m++)
printf( "%2d   ",board[p4[i][k]][p4[j][m]]);
printf( "\n ");
}
}
}

}

void   construct()
{
int   i,j,k,m,x[4];
for   (i=0;i <24;i++)
{
for   (j=0;j <24;j++)
{
for   (k=0;k <4;k++)
{
x[k]=34-p[q[0]][k]-p[q[1]][p4[i][k]]-p[q[2]][p4[j][k]];
board[3][k]=x[k];
if   (x[k]<1   ||   x[k]>16   ||   !((1l <<(x[k]-1))   &   s[q[3]]))   break;
for   (m=0;m <k;m++)
if   (x[m]==x[k])   break;
if   (m <k)   break;
}
if   (k==4)
{
for   (k=0;k <4;k++)
board[0][k]=p[q[0]][k];
for   (k=0;k <4;k++)
board[1][k]=p[q[1]][p4[i][k]];
for   (k=0;k <4;k++)
board[2][k]=p[q[2]][p4[j][k]];
finalJudge();
}
}
}
}

void   make(int   b,int   deep)
{
        int   i,j,sum;
        if   (deep>=4)
        {
                for   (j=0,sum=0;j <4;j++)
                        sum+=(p[l+1][j]=p[l][j]);
                if   (sum==34)
                {
                        for   (j=0,s[l]=0;j <4;j++)
                                s[l]+=1l <<(p[l][j]-1);
                        l++;
                }
                return;
        }

        for   (i=b;i <=16;i++)
        {
                p[l][deep]=i;
                make(i+1,deep+1);
        }
}

void   makeP44(int   deep){
int   i,j,flag;
if   (deep>=4)
{
for   (j=0;j <4;j++)
p4[t+1][j]=p4[t][j];
t++;
return;
}
for   (i=0;i <4;i++)
{
p4[t][deep]=i;
flag=1;
for   (j=0;j <deep;j++)
if   (p4[t][j]==i)   flag=0;
if   (flag)   makeP44(deep+1);
}
}

void   solve(int   b,int   deep)
{
int   i,j,flag;
if   (deep>=4)
{
construct();
return;
}
for   (i=b;i <l;i++)
{
q[deep]=i;
flag=1;
for   (j=0;j <deep;j++)
if   (s[q[j]]   &   s[i])   flag=0;
if   (flag)   solve(i+1,deep+1);
}
}

main(){
make(1,0);
makeP44(0);
solve(0,0);
printf( "total=%ld\n ",total);
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//