zoj 2778 - Triangular N-Queens Problem
2014-09-19 11:47
225 查看
题目:在三角形的棋盘上放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,因此至少有一半是奇数点;
偶数点只要插入到奇数点之间就可以构造了,构造成功。
说明:(2011-09-19 01:28)。
分析:找规律题目,按照题目的输出,可以看出构造法则;
先填奇数,后填偶数。下面我们只要证明这种构造的存在性即可。
解法:先给出集体构造方法,从(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,因此至少有一半是奇数点;
偶数点只要插入到奇数点之间就可以构造了,构造成功。
说明:(2011-09-19 01:28)。
#include <stdio.h> #include <stdlib.h> #include <string.h> bool M[ 1001 ][ 1001 ]; int F[ 1005 ]; int A[ 668 ]; int B[ 668 ]; int main() { /* 递推公式 memset( F, 0, sizeof( F ) ); F[ 0 ] = 0;F[ 1 ] = 1;F[ 2 ] = 1; for ( int i = 3 ; i <= 1000 ; ++ i ) F[ i ] = F[ i-3 ] + 2; */ for ( int i = 1 ; i <= 1000 ; ++ i ) F[ i ] = (2*i+1)/3; int c,n; while ( scanf("%d",&c) != EOF ) for ( int t = 1 ; t <= c ; ++ t ) { memset( M, 0, sizeof( M ) ); scanf("%d",&n); printf("%d %d %d\n",t,n,F[ n ]); int y = n-F[ n ]+1; int x = 1; for ( int i = 0 ; i < F[ n ] ; ++ i ) { A[ i ] = y;B[ i ] = x; M[ y ][ x ] = 1; y += 1;x += 2; if ( x > y ) x = 2; } /* 绘图部分 for ( int p = 1 ; p <= n ; ++ p ) { for ( int q = 0 ; q < n-p ; ++ q ) printf(" "); for ( int q = 1 ; q <= p ; ++ q ) if ( M[ p ][ q ] ) printf("* "); else printf("@ "); printf("\n"); } */ printf("[%d,%d]",A[ 0 ],B[ 0 ]); for ( int i = 1 ; i < F[ n ] ; ++ i ) { if ( i%8 == 0 ) printf("\n"); else printf(" "); printf("[%d,%d]",A[ i ],B[ i ]); } printf("\n\n"); } return 0; }
相关文章推荐
- zoj2778 Triangular N-Queens Problem(找规律)
- ZOJ 2773 Triangular Sums (水)
- POJ 3086 Triangular Sums (ZOJ 2773)
- POJ 3086 Triangular Sums (ZOJ 2773)
- POJ 3091 Triangular N-Queens Problem 笔记
- ZOJ Problem Set - 2773 Triangular Sums【公式】
- zoj 2773 || poj 3086 Triangular Sums(水)
- ZOJ1260 POJ1364 HDU1531 King
- ZOJ 1828 Fibonacci Numbers
- zoj 2836 Number Puzzle(容斥,求1到m有多少个数能被数组里任意一个整除)
- 2017浙江省赛 H - Binary Tree Restoring ZOJ - 3965
- zoj 2971 Give Me the Number
- zoj 3761 Easy billiards 并查集+dfs
- ZOJ 3778 Talented Chef 模拟 [ 祝愿明天省赛一帆风顺, ZJSU_Bloom WILL WIN : )
- zoj 1100 - Mondriaan's Dream
- zoj1076 Gene Assembly 活动安排 dp
- Zoj3762 等待解决
- zoj 3876 May Day Holiday
- zoj2563 Long Dominoes(状压dp)
- ZOJ 3204 Connect them 字典序输出最短路