这一题在我刚开始拿到的时候,是一点思路都没有的,只能先分析题目的要求,即queen之间的规则:

  • 不能同行
  • 不能同列
  • 不能同斜线
    • 不能同左斜
    • 不能同右斜

同时发现,在寻找所有可能结果的穷举过程中,传入的参数并不需要以整个“棋盘”的形式,只需要传入之前确定的所有queen的位置即可。

这样就可以先写下,在遍历每个潜在的位置合法性的判断函数,同时确定回溯时使用的重要的数据格式:

        //coordinateXY[i]:第i个点的横纵坐标
//coordinateXY[i][0]——横坐标
//coordinateXY[i][1]——纵坐标
int[][] coordinateXY = new int[n][2]; //x1 y1 是需要判断的是否合法的坐标
private boolean validXY(int x1, int y1, int[][] coordinateXY) {
int x2 = -1, y2 = -1;
for (int i = 0; i < n && coordinateXY[i][1] != -1; ++i) {
x2 = coordinateXY[i][0];
y2 = coordinateXY[i][1];
// 同列 || 同左斜 || 同右斜
if ((y1 == y2) || (x1+y1 == x2+y2) || (x1-x2 == y1-y2)) {
return false;
}
}
return true;
}

回溯时记录结果的数据格式coordinateXY确定了,自然可以确定最终结果集的构造:

    List<List<String>> result = new ArrayList<>();

    //构造返回值
private List<String> print(int[][] coordinateXY) {
List<String> ans = new ArrayList<>();
StringBuilder sb = null;
int y = -1;
for (int[] xy : coordinateXY) {
sb = new StringBuilder();
y = xy[1];
for (int i = 0; i < n; ++i) {
//三元表达式代替if-else
sb.append((i == y) ? "Q" : ".");
}
ans.add(sb.toString());
}
return ans;
}

最后根据回溯三部曲,确定下回溯函数:

    //x:当前的第x个queen,也是这个queen所在的横坐标的值
private void function(int x, int[][] coordinateXY) {
//如果x==n,证明0~n-1个queen都已经确定了坐标,即可记录下此结果
if (x == n) {
result.add(print(coordinateXY));
return ;
} //对于当前这个第x个queen,横坐标coordinateXY[x][0] == x
//只要从0 ~ n-1寻找合法的y即可
for (int y = 0; y < n; ++y) {
if (validXY(x, y, coordinateXY)) {
//记录下合法的坐标
coordinateXY[x][1] = y;
//将第x个queen的纵坐标加入path(coordinateXY),递归的寻找第x+1个queen的所有合法的纵坐标
function(x+1, (int[][]) coordinateXY.clone());
//删除本次记录,继续寻找下一个可能的y
coordinateXY[x][1] = -1;
}
}
}

这题的关键点主要在:

  • 确定记录结果的数据结构
  • 确定validXY函数
  • 根据queen不能在同一行,确定下回溯是按照行向下遍历的逻辑

最新文章

  1. 同一界面放两个TTIWDBAdvWebGrid的问题(delphi IW TMS)
  2. Smart ECM数据发布假数据测试工作。
  3. NSArray,NSSet,NSDictionary的遍历,基本使用集锦
  4. [转载].Net中如何操作IIS(源代码)
  5. Memcached总结三:Memcached常用命令及使用说明
  6. PHP input 显示html 元素
  7. 介绍Python程序员常用的IDE和其它开发工具
  8. STM32-USB详细使用说明(转)
  9. 网络协议 16 - DNS 协议:网络世界的地址簿
  10. Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
  11. Android Lifecycle使用
  12. 微信分享接口 略缩图 php
  13. Python endswith() 函数
  14. python simple factory mode example
  15. BZOJ3267/3272 KC采花/Zgg吃东西(线段树)
  16. displaytag的Excel导出实践
  17. The number of sections contained in the collection view after the update (1) must be equal to the number of sections contained in the collection view before the update (0), plus or minus the number of
  18. 【BioCode】读文件夹以发现缺失文件
  19. scp 从本地往线上传文件
  20. php对图片加水印--将一张图片作为水印加到另一张图片

热门文章

  1. 菜鸡的Java笔记
  2. 【拥抱元宇宙】创建你的第一个Unity程序HelloWorld,并发布
  3. Maven中所用的Dependency查找方法
  4. Assassin暗杀者-自用短小精悍的webshell管理工具分享
  5. git添加新工程
  6. 微信小程序中途加入云开发之坑
  7. 洛谷 P3647 [APIO2014]连珠线(换根 dp)
  8. 洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)
  9. Codeforces 739D - Recover a functional graph(二分图匹配)
  10. webpack--css、html 和 js 代码的常用处理