- 论坛徽章:
- 0
|
我也贴一个,思路与上面几位的不同。
我的方法是模拟“实际”填入的过程,用 x, y 标记位置,通过一个估值函数求出下一步的位置。估值标准为尽可能靠近原来的那堆点。
- #include <stdio.h>
- #define N 9
- int a[N][N], t;
- int weight (int x, int y)
- {
- if (x<0 || x>= N || y<0 || y>=N || a[x][y]==0)
- return 0;
- else
- return 1+(x==y);
- }
- int value (int x, int y)
- {
- int i, j, s=0;
- if (x<0||x>=N||y<0||y>=N || a[x][y]!=0)
- return 0;
- for (i=x-1; i<=x+1; i++)
- for (j=y-1; j<=y+1; j++)
- {
- if (!(i==x && j==y))
- s+=weight(i,j);
- }
- return s;
- }
- void next (int *x, int *y)
- {
- int i=0, j=0, d, current=0;
- if ((d=value(*x-1, *y))>current)
- i=*x-1, j=*y, current=d;
-
- if ((d=value (*x+1, *y))>current)
- i=*x+1, j=*y, current=d;
-
- if ((d=value (*x, *y-1))>current)
- i=*x, j=*y-1, current=d;
-
- if ((d=value (*x, *y+1))> current)
- i=*x, j=*y+1, current=d;
- *x=i, *y=j;
- a[i][j]= ++t;
- }
- int
- main ()
- {
- int x, y;
- a[0][0]=1; a[0][1]=2;
- x=0, y=1, t=2;
- while (t<N*N)
- next(&x, &y);
- for (x=0; x<N; x++)
- {
- for (y=0; y<N; y++)
- printf ("%2d ", a[x][y]);
- putchar ('\n');
- }
- }
复制代码
[ 本帖最后由 win_hate 于 2009-10-9 12:16 编辑 ] |
|