由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 关于8皇后问题,这个解是O(n^2)吗?
相关主题
F家电面一般都多少轮?(附电面题)问一道矩阵题,有没有时间复杂度低点的解?
一道不错的算法题问个 matrix 的问题 (CS)
貌似是G家的面试题。。。吧。。。一道LeetCode Unique Paths的变种
一道矩阵路径题一道面试问题求助
有人做过storm8的online coding test么,题目难度如何?屏幕尺寸
相关话题的讨论汇总
话题: column话题: int话题: 对角线话题: 皇后话题: line
进入JobHunting版参与讨论
1 (共1页)
h*****g
发帖数: 312
1
zz:
原文:
http://blog.csdn.net/njnu_mjn/archive/2010/04/04/5449098.aspx
八皇后问题(C++) 收藏
1 、问题描述: 在一个8*8 的棋盘上放置8 个皇后,不允许任何两个皇后在棋盘的同
一行、同一列和同一对角线上。
2 、关键字: 递归、上溯
3 、技巧:
1 )、
经观察发现,对8 x 8 的二维数组上的某点a[i][j](0<=i,j<=7)
其主对角线(即左上至右下)上的每个点的i-j+7 的值(范围在(0,14) )均相等;
其从对角线(即右上至左下)上的每个点的i+j 的值(范围在(0,14) )均相等;
且每个主对角线之间的i-j+7 的值均不同,每个从对角线之间的i-j+7 的值亦不同;
如a[3][4]:
主:3-4+7=6
从:3+4=7
因此可设两个数组b[15],c[15] 分别表示主、从对角线是否安全
(为1 表示有皇后,不安全;为0 表示安全)
2 )、
每行有且仅有一个皇后:
每i 个皇后放在每i 行(0<=i<=7)
void eightQueens( int line );
4 、源码( C++ )
//eight_queens.cpp
#include
using namespace std;
int data[ 8 ][ 8 ]; //chess(double dimensional array)
int a[ 8 ]; //column( 列)
int b[ 15 ]; // 主对角线( 左上至右下)
int c[ 15 ]; // 从对角线( 右上至左下)
int count = 0;
void eightQueens( int );
void output( const int [][ 8 ], int );
int main()
{
int i, j;
for( i = 0; i < 15; ++i ) // 主、从对角线
b[ i ] = c[ i ] = 0; // 表示安全
for( i = 0; i < 8; ++i )//chess
{
a[ i ] = 0; //i 列安全
for( j = 0; j < 8; ++j )
data[ i ][ j ] = 0;
}
eightQueens( 0 );
cout << "\ncount = " << count << endl;
return 0;
}
void eightQueens( int line )
{
if( 8 == line )// 八个皇后安置就位,输出
{
output( data, 8 );
cout << endl;
return;
}
for( int column = 0; column < 8; ++column )
{
if( 0 == a[ column ] && 0 == b[ line - column + 7 ] && 0 == c[ line +
column ] )
{
data[ line ][ column ] = 1; //
安置皇后
a[ column ] = 1; // 此列被占
b[ line - column + 7 ] = 1; // 主对角线被占
c[ line + column ] = 1; // 从对角线被占
eightQueens( line + 1 ); // 下一个皇后
// 重置
data[ line ][ column ] = 0;
a[ column ] = 0;
b[ line - column + 7 ] = 0;
c[ line + column ] = 0;
}
}
}
//output chess
void output( const int data[][ 8 ], int size )
{
for( int i = 0; i < size; ++i )
{
for( int j = 0; j < size; ++j )
cout << data[ i ][ j ] << ' ';
cout << endl;
}
++count;
}
5 、性能:
时间复杂度O(n^2)
6 、测试
环境:VC++6.0
G********g
发帖数: 745
2
不止吧。N^N
a********m
发帖数: 15480
3
n!
1 (共1页)
进入JobHunting版参与讨论
相关主题
有人做过storm8的online coding test么,题目难度如何?屏幕尺寸
问一道矩阵题,有没有时间复杂度低点的解?F家电面一般都多少轮?(附电面题)
问个 matrix 的问题 (CS)一道不错的算法题
一道LeetCode Unique Paths的变种貌似是G家的面试题。。。吧。。。
一道面试问题求助一道矩阵路径题
相关话题的讨论汇总
话题: column话题: int话题: 对角线话题: 皇后话题: line