N皇后问题
来源:互联网 发布:java访问控制修饰符 编辑:程序博客网 时间:2024/06/13 01:00
在N*N棋盘上放置着N个皇后,使得她们不能相互攻击,每个皇后的攻击范围是同行同列和同对角线,求出所有解。
皇后不能同行,因此可以逐行考虑每个皇后,使其纵向和斜向不会攻击即可。
/*打印棋盘*/void print(){ for(int i=0; i<n; i++) { int c = C[i]; for(int i=0; i<c; i++) printf(". "); printf("Q"); for(int i=c+1; i<n; i++) printf(". "); printf("\n"); } printf("\n");}void search(int cur){ if(cur == n) { print(); } else for(int i=0; i<n; i++) { int ok = 1; C[cur] = i; for(int j=0; j<cur; j++) { /*纵向和正负对角线不能相互攻击*/ if(C[cur]==C[j] || cur-C[cur]==j-C[j] || cur+C[cur]==j+C[j]) { ok = 0; break; } } if(ok) search(cur+1); }}
可以进一步提高效率,利用二维数组vis[3][]直接判断当前位置所在的列和对角线是否已经存在皇后。注意,主对角线y-x可能为负值,则加上n。
void search(int cur){ if(cur == n) { print(); } else for(int i=0; i<n; i++) if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n]) //当前点在(cur,i),cur+i为所在副对角线,cur-i+n为主对角线 { C[cur] = i; vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1; search(cur+1); vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0; //取消标记 }}
0 0
- N*N皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N 皇后问题
- N皇后问题
- N皇后问题算法
- N 皇后问题
- N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N皇后问题优化
- N皇后问题
- n皇后问题
- N皇后问题
- 性能优化
- js 将json字符串转换为json对象的方法解析
- 移位
- UVA 1349 Optimal Bus Route Design 最小费用流+拆点
- android static对内存的影响
- N皇后问题
- FaceBook/infer-infer工作流
- windows下apache部署django项目个人总结(备查)
- 游戏编程入门
- 学习七十一雾央MFC游戏心得,初体验(七)
- MySQL系列,第1部分:Mysql简介
- 大小端
- 英语词典小程序
- Android开发Bitmap在Native层与Java层内存的两种生成方式