-
-
[郁闷]绝无抄袭,绝无更改,全部复制
-
发表于: 2010-10-22 11:37 4578
-
从前天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);
}
#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);
}
赞赏
他的文章
- 文件过滤驱动DEMO版 19693
- [原创]编写自己的反汇编引擎之用法举例 8629
- [原创]编写自己的反汇编引擎 30842
- [郁闷]绝无抄袭,绝无更改,全部复制 4579
- [原创]上午看到题,不知道现在晚不晚 3352
看原图
赞赏
雪币:
留言: