一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 369|回复: 5
收起左侧

[Leetcode] Sudoku Solver 为什么stackflow啊

[复制链接] |试试Instant~ |关注本帖
caffery24 发表于 2015-7-26 14:00:13 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
  1. public class Solution {
  2.   
  3.     public void solveSudoku(char[][] board) {
  4.     List<Set> list=new ArrayList<Set>();
  5.     for(int i=0;i<27;i++)
  6.     list.add(new HashSet());
  7.     for(int i=0;i<9;i++)
  8.     {
  9.         for(int j=0;j<9;j++)
  10.         {if(board[i][j]!='.')
  11.             {list.get(i).add(board[i][j]);
  12.             list.get(9+j).add(board[i][j]);
  13.             list.get(i/3*3+j/3+18).add(board[i][j]);
  14.             }
  15.         }
  16.     }
  17.     writ(0,0,board,list);
  18.     }
  19.    
  20.     public boolean writ(int i, int j, char[][] board,List<Set> list)
  21.     {   
  22.     if(i==9)
  23.     return true;
  24.     if(board[i][j]!='.')
  25.     {if(j<8)
  26.     return writ(i,j++,board,list);
  27.     else
  28.     return writ(i++,0,board,list);
  29.     }
  30.     else
  31.     {
  32.         for(char num='1';num<='9';num++)
  33.         {  if(!list.get(i).contains(num)&&!list.get(j+9).contains(num)&&!list.get(i/3*3+j/3+18).contains(num))
  34.             {
  35.                 board[i][j]=num;
  36.                 list.get(i).add(board[i][j]);
  37.                 list.get(9+j).add(board[i][j]);
  38.                 list.get(i/3*3+j/3+18).add(board[i][j]);
  39.             }
  40.           if(j<8&&writ(i,j++,board,list))
  41.           return true;
  42.           else if(j==8&&writ(i++,0,board,list))
  43.           return true;
  44.           else{
  45.               board[i][j]='.';
  46.            list.get(i).remove(num);
  47.           list.get(9+j).remove(num);
  48.        list.get(i/3*3+j/3+18).remove(num);
  49.           }
  50.           }
  51.         }
  52.         return false;
  53.     }
  54. }
复制代码
zhuli19901106 发表于 2015-7-26 16:47:58 | 显示全部楼层
缩进无法直视。。。
栈溢出一般都是因为递归写的不对,请检查递归的参数、递归终止条件和递归过程中对参数的修改是否有误。
回复 支持 1 反对 0

使用道具 举报

zhuli19901106 发表于 2015-7-26 16:56:31 | 显示全部楼层
本帖最后由 zhuli19901106 于 2015-7-26 17:04 编辑

另外,代码中通篇都是3、9、8、27、18之类的,这种编程风格要极力避免。
http://baike.baidu.com/view/1922945.htm#2
题目中并未规定数独一定是9x9,不管测试数据是否都是9x9,都切忌自行修改题目条件。实际工作中这种行为可以让你丢掉工作。

不建议这样直接贴代码给别人肉眼debug,这样基本等于伸手党,对自己的提高毫无帮助。我记得在有些ACM群里,贴代码求debug会直接被踢出群的。
如果自己的代码实在调不好,可以上网找别人AC的代码进行对比,这称为“对拍”。
如果肉眼debug的经验还不到位,你可以借助Eclipse单步运行,仔细观察各个变量的变化。另外,栈溢出的时候,程序应该会被强制中断,这时貌似也可以查看断点在哪儿。
总之,调试一定是自己的事。
回复 支持 1 反对 0

使用道具 举报

 楼主| caffery24 发表于 2015-7-27 09:01:02 | 显示全部楼层
zhuli19901106 发表于 2015-7-26 16:56
另外,代码中通篇都是3、9、8、27、18之类的,这种编程风格要极力避免。
http://baike.baidu.com/view/192 ...

...额,这个好像是9*9吧,要不如何放下1---9之间的数字;我是做出来了,但是换了数组,再eclipse通过了。。。可能递归太深,oj通过不了
回复 支持 反对

使用道具 举报

zhuli19901106 发表于 2015-7-27 11:59:15 | 显示全部楼层
caffery24 发表于 2015-7-27 09:01
...额,这个好像是9*9吧,要不如何放下1---9之间的数字;我是做出来了,但是换了数组,再eclipse通过 ...

你可以定义常量啊,比如private static final int N=9;
这样代码可读性会更好些的,而且便于扩展。
回复 支持 反对

使用道具 举报

 楼主| caffery24 发表于 2015-7-27 12:22:04 | 显示全部楼层
zhuli19901106 发表于 2015-7-27 11:59
你可以定义常量啊,比如private static final int N=9;
这样代码可读性会更好些的,而且便于扩展。

哦哦,谢谢你啊,我以后还是得多注意下。。。有时候真的就是调一调的就心烦意乱
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 05:28

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表