有经验的聊城网站建设,wordpress 内网映射,龙华建设发展有限公司网站,网站建设哪些分类题目链接#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2553 方法#xff1a; 1.可以用对称的思想#xff0c;即#xff1a;如果N是偶数#xff0c;则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和#xff0c;最后再乘以2。如果是奇数#…题目链接 http://acm.hdu.edu.cn/showproblem.php?pid2553 方法 1.可以用对称的思想即如果N是偶数则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和最后再乘以2。如果是奇数再单独计算一个在N/21这个位置的结果。 2.一个皇后如果放在一个位置要把该位置对应的行列上的位置和以该位置为起点从左下 和 右下45读的两个方向延伸穿过的位置都设置为不可再放。 3.在状态数中在第i层为第i个皇后找位子其实就是在棋盘的第i行找。找不到就返回否则修改棋盘继续收索直到第N层也搜索成功此时给结果加1. 感想后期多看。 代码 View Code #includeiostream
#includemath.h
#include algorithm
using namespace std;
int n;
int table[11];
struct Record
{int row;int col;
};
bool canPlace[11][11];
int total_sum0;
void usedPlace(int x,int y)
{for(int ix,jy;injn;i,j)canPlace[i][j]false;for(int ix,jy;in j1;i,j--)canPlace[i][j]false;for(int i x;in;i)canPlace[i][y]false;
}void DFSSearch( int start 1)
{if(startn){total_sum;return;}bool t_canPlace[11][11];for(int i1;in;i)for(int j1;jn;j)t_canPlace[i][j] canPlace[i][j];for(int i1;in;i){if(canPlace[start1][i]){usedPlace(start1,i);DFSSearch(start1);for(int i1;in;i)for(int j1;jn;j)canPlace[i][j] t_canPlace[i][j];}}
}
int main()
{memset(table,-1,sizeof(table));while(scanf(%d,n) n!0){int sum0;if(table[n]-1){int boundary n/2;total_sum0;for(int i1;iboundary;i){memset(canPlace,true,sizeof(canPlace));usedPlace(1,i);DFSSearch();}sumtotal_sum*2;if(n%2!0){total_sum0;memset(canPlace,true,sizeof(canPlace));usedPlace(1,boundary1);DFSSearch();sumtotal_sum;}table[n]sum;}elsesum table[n];coutsumendl;}return 0;
} 转载于:https://www.cnblogs.com/kbyd/archive/2013/04/16/3024405.html