📣 4th of July限时特惠: VIP通行证立减$68
查看: 1409| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Sudoku Solver 为什么stackflow啊

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

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. }
复制代码

上一篇:isSubTree那题经典follow up想考察什么?
下一篇:贡献一下我刷的leetcode,C++代码
全局:
本帖最后由 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单步运行,仔细观察各个变量的变化。另外,栈溢出的时候,程序应该会被强制中断,这时貌似也可以查看断点在哪儿。
总之,调试一定是自己的事。
回复

使用道具 举报

全局:
缩进无法直视。。。
栈溢出一般都是因为递归写的不对,请检查递归的参数、递归终止条件和递归过程中对参数的修改是否有误。
回复

使用道具 举报

🔗
 楼主| 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;
这样代码可读性会更好些的,而且便于扩展。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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