N-Queens

这是经典的题目,但是写的很痛苦。大致思路是容易得到的,难在细节以及把递归思路想清楚。

教训:

(1)在要求所有解的DFS中,不要在得到一个解时把中间状态清0,不要受回溯思想的影响;这里的memo不用恢复的原因是下次计算自然就把当前的memo覆盖了,当然你去恢复也没有错。

(2)一路改BUG写完的程序,不是真正的写完,说明你没有真正想清楚,下次再写还会犯同样的错误。与其下次再犯,不如这次仔细反省,仔细检查思路为什么会出现这样的bug。

class Solution {
public:
    void solve(vector<vector<string> > &result,vector<string> &oneAns, int *memo ,int r,int size){
        if(r==size) {
            for(int i=0;i<size;++i)
                oneAns[i][memo[i]]='Q';
            result.push_back(oneAns); 
            for(int i=0;i<size;++i)
                oneAns[i][memo[i]]='.';// if meme[i]=-1, then will get the wrong answer!
        }
        int col,row;
        for(col=0;col<size;++col){
            for(row=0;row<r;++row)
                if(col==memo[row] or abs(r-row)==abs(col-memo[row])) break;
            if(row==r) {
            	memo[r]=col;
            	solve(result,oneAns,memo,r+1,size);
            	memo[r]=-1;// Actually you don't need do this
            }
        }
    }

    vector<vector<string> > solveNQueens(int n) {
        vector<vector<string> > result;
        if(n==0) return result;
        int *memo = new int[n];
        memset(memo,-1,n*sizeof(int));
        
        string rs(n,'.');
        vector<string> oneAns(n,rs);      
        solve(result,oneAns,memo,0,n);
        
        return result;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值