|
发表于 2003-7-9 06:19:14
|
显示全部楼层
先贴一下我的完全穷举的程序,慢的很,N>=4的情况还是不要试了。
- #include <stdio.h>
- #define N 3
- #define N2 9
- #define SUM 15
- #define FALSE 0
- #define TRUE 1
- #define WIDTH 2
- int testsum(void);
- void print_a(void);
- void func(int);
- int a[N2];
- int num[N2];
- char line[(WIDTH + 1) * N + 1];
- int count;
- int main(void)
- {
- int i;
- memset(line, '-', (WIDTH + 1) * N);
- line[(WIDTH + 1) * N] = '\0';
- for(i = 0; i < N2; ++i)
- num[i] = 0;
- func(0);
- printf("count: %d\n", count);
- exit(0);
- }
- int
- testsum(void)
- {
- int x, y, sum;
- for(y = 0; y < N; ++y){
- sum = 0;
- for(x = 0; x < N; ++x)
- sum += *(a + y * N + x);
- if(sum != SUM)
- return(FALSE);
- }
- for(x = 0; x < N; ++x){
- sum = 0;
- for(y = 0; y < N; ++y)
- sum += *(a + y * N + x);
- if(sum != SUM)
- return(FALSE);
- }
- sum = 0;
- for(x = 0, y = 0; x < N; ++x, ++y)
- sum += *(a + y * N + x);
- if(sum != SUM)
- return(FALSE);
- sum = 0;
- for(x = N - 1, y = 0; y < N; --x, ++y)
- sum += *(a + y * N + x);
- if(sum != SUM)
- return(FALSE);
- ++count;
- return(TRUE);
- }
- void
- print_a(void)
- {
- int x, y, i;
- for(y = 0; y < N; ++y){
- for(x = 0; x < N; ++x)
- printf("%*d ", WIDTH, *(a + y * N + x));
- printf("\n");
- }
- printf("%s\n", line);
- }
- void
- func(int n)
- {
- int i, sum = 0, val;
- for(i = 0; i < N2; ++i){
- if(num[i] == 0){
- num[i] = 1;
- *(a + n) = i + 1;
- if(n == N2 - 1){
- if(testsum())
- print_a();
- }else
- func(n + 1);
- num[i] = 0;
- }
- }
- }
复制代码
time了一下N=3时间是0.261
改进的程序回头再贴。 |
|