_xiaobai_

导航

zoj2778 Triangular N-Queens Problem(找规律)

/*
 
 分析: 三角N皇后问题,找规律题目,按照题目的输出,可以看出构造法则,
   先填奇数,后填偶数。下面我们只要证明这种构造的存在性即可。
 解法: 先给出集体构造方法,从(1,n-f(n)+1) 开始填充奇数点,填充所有的
   (1+2k,n-f(n)+1+k){其中f(n)就是最大填充数,1+2k<=n-f(n)+1+k}
   之后开始从(2,n-f(n)+1+k+1)开始填充偶数点,由于奇数点只能攻击奇数点,
   偶数点只能攻击偶数点,所以只要保证每行一个皇后就可以了。
 证明:  我们只需要证明从第n-f(n)+1行开始,每行都可以放一个皇后就可以了。
   首先,按照上面的构造可知,如此构造,皇后是不可以互相攻击的。
   然后,由于第i行有i个元素,所以有 1+2k<=n-f(n)+1+k,
     解得,k <= n-f(n)>= f(n)/2,因此至少有一半是奇数点,
     偶数点只要插入到奇数点之间就可以构造了。
   构造成功。
 
*/

View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 bool M[ 1001 ][ 1001 ];
5 int F[ 1005 ];
6 int A[ 668 ];
7 int B[ 668 ];
8
9 int main()
10 {
11 /* 递推公式
12 memset( F, 0, sizeof( F ) );
13 F[ 0 ] = 0;F[ 1 ] = 1;F[ 2 ] = 1;
14 for ( int i = 3 ; i <= 1000 ; ++ i )
15 F[ i ] = F[ i-3 ] + 2;
16 */
17 for ( int i = 1 ; i <= 1000 ; ++ i )
18 F[ i ] = (2*i+1)/3;
19 int c,n;
20 while ( scanf("%d",&c) != EOF )
21 for ( int t = 1 ; t <= c ; ++ t ) {
22 memset( M, 0, sizeof( M ) );
23
24 scanf("%d",&n);
25 printf("%d %d %d\n",t,n,F[ n ]);
26
27 int y = n-F[ n ]+1;
28 int x = 1;
29 for ( int i = 0 ; i < F[ n ] ; ++ i ) {
30 A[ i ] = y;B[ i ] = x;
31 M[ y ][ x ] = 1;
32 y += 1;x += 2;
33 if ( x > y ) x = 2;
34 }
35 /* 绘图部分
36 for ( int p = 1 ; p <= n ; ++ p ) {
37 for ( int q = 0 ; q < n-p ; ++ q )
38 printf(" ");
39 for ( int q = 1 ; q <= p ; ++ q )
40 if ( M[ p ][ q ] )
41 printf("* ");
42 else
43 printf("@ ");
44 printf("\n");
45 }
46 */
47 printf("[%d,%d]",A[ 0 ],B[ 0 ]);
48 for ( int i = 1 ; i < F[ n ] ; ++ i ) {
49 if ( i%8 == 0 ) printf("\n");
50 else printf(" ");
51 printf("[%d,%d]",A[ i ],B[ i ]);
52 }
53 printf("\n\n");
54 }
55 return 0;
56 }

posted on 2011-08-17 14:28  _xiaobai_  阅读(255)  评论(0编辑  收藏  举报