- 积分
- 13
- UID
- 580
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2004-11-29 09:47:32
|
显示全部楼层
下面是最初始的代码之一,显然可以有一些小的优化,但是如何并行,网格是个问题。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#define N9 10000000
int space[100][100][100];
long int NumConf0,NumConf1,NumConf2;
long int NumConf02D,NumConf12D;
int step,N,X,Y,Z;
int search();
int search2D();
int direction(int x,int y,int z);
time_t startTime,endTime;
int direction2D(int x, int y)
{
if (space[X+x][Y+y][Z] == 0){
X+=x;
Y+=y;
space[X][Y][Z]=1;
if(step < N) direction(0,0,1);
search2D();
space[X][Y][Z]=0;
X-=x;
Y-=y;
}
return (0);
}
int search2D()
{
step++;
if (step <= N) {
direction2D(-1,0);
direction2D(0,-1);
direction2D(1,0);
direction2D(0,1);
}
else {
NumConf02D++;
if ( NumConf02D >= N9)
{
NumConf02D %= N9;
NumConf12D++;
}
}
step--;
return (0);
}
int direction(int x, int y, int z)
{
if (space[X+x][Y+y][Z+z] == 0){
X+=x;
Y+=y;
Z+=z;
space[X][Y][Z]=1;
search();
space[X][Y][Z]=0;
X-=x;
Y-=y;
Z-=z;
}
return (0);
}
int search()
{
step++;
if (step < N) {
direction(-1,0,0);
direction(0,-1,0);
direction(0,0,-1);
direction(1,0,0);
direction(0,1,0);
direction(0,0,1);
}
else {
NumConf0++;
if ( NumConf0 >= N9)
{
NumConf0 %= N9;
NumConf1++;
if (NumConf1 >= N9)
{
NumConf1 %= N9;
NumConf2++;
}
if (NumConf1%1000 ==0)
{
endTime=time(NULL);
printf ("%ld seconds %ld-%ld-%ld\n",endTime-startTime,NumConf2,NumConf1,NumConf0);
}
}
}
step--;
return (0);
}
int main(int argc, char *argv[])
{
FILE *fcn;
int i,j;
long num0,num1;
N=0;
if (argc == 2 )
{
for (i=0;i<strlen(argv[1]);i++)
{
j=*(argv[1]+i)-'0';
if ( j < 0 || j >= 10)
{
printf("Usage: %s N\n",*(argv));
exit(1);
}
else
{
N*=10;
N+=j;
}
}
}
else
{
printf("Usage: %s N\n",*argv);
exit(1);
}
printf(" 166 seconds on Pentium3/800MHz for N=16\n");
printf(" 79 seconds on athlon-mp 2000+ for N=16\n");
X=Y=Z=50;
space[X][Y][Z]=1;
startTime = time(NULL);
for (i=1;i<=N;i++){
Y++;
space[X][Y][Z]=1;
step=i+1;
direction2D(1,0);
}
endTime=time(NULL);
printf (" %ld seconds.\n",endTime-startTime);
NumConf0 *= 48;
NumConf1 *= 48;
NumConf2 *= 48;
NumConf1 += NumConf0/N9;
NumConf0 %= N9;
NumConf2 += NumConf1/N9;
NumConf1 %= N9;
NumConf02D--;
NumConf02D *= 24;
NumConf12D *= 24;
NumConf12D += NumConf02D/N9;
NumConf02D %= N9;
NumConf0 += NumConf02D;
NumConf1 += NumConf0/N9;
NumConf0 %= N9;
NumConf0 += 6;
NumConf1 += NumConf12D;
NumConf2 += NumConf1/N9;
NumConf1 %= N9;
printf(" N= %d CN= ", N);
if (NumConf2 !=0) printf("%ld",NumConf2);
j=N9;num0=num1=NumConf1;
for (i=1;i<8;i++){ j/=10;num1=num0/j;num0%=j;printf("%ld",num1);}
j=N9;num0=num1=NumConf0;
for (i=1;i<8;i++){ j/=10;num1=num0/j;num0%=j;printf("%ld",num1);}
printf("\n");
fcn=fopen("SAW_cubic.dat","a");
fprintf(fcn,"%10ld seconds N= %d CN= ",endTime-startTime, N);
if (NumConf2 !=0) fprintf(fcn,"%ld",NumConf2);
j=N9;num0=num1=NumConf1;
for (i=1;i<8;i++){ j/=10;num1=num0/j;num0%=j;fprintf(fcn,"%ld",num1);}
j=N9;num0=num1=NumConf0;
for (i=1;i<8;i++){ j/=10;num1=num0/j;num0%=j;fprintf(fcn,"%ld",num1);}
fprintf(fcn,"\n");
fcloseall();
return(0);
} |
|