题解 | #牛吃草问题#

牛吃草问题

https://www.nowcoder.com/practice/c6e33216019a4ea9bf4015e9868dd225

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    // 检测对角线是否有放置牛
    bool check(vector<vector<int>>& grid, int start, int i) {
        bool flag = true;
        int cur_i = start-1, cur_j = i-1;
        while (cur_i >= 0 && cur_j >= 0) {
            if (grid[cur_i][cur_j]) {
                flag = false;
                break;
            }
            cur_i--, cur_j--;
        }
        if (!flag) return false;
        cur_i = start-1, cur_j = i+1;
        while (cur_i >= 0 && cur_j < grid[0].size()) {
            if (grid[cur_i][cur_j]) {
                flag = false;
                break;
            }
            cur_i--, cur_j++;
        }
        if (!flag) return false;
        return true;
    }
    
    // vis用来表示列中选过的位置,start表示当前要选的行
    void backtrace(vector<vector<int>>& grid, vector<int>& vis, int start, int& ans) {
        // 如果要选的超过了,则表示满足一种方法
        if (start >= grid.size()) {
            ans++;
            return;
        }
        // 这么每次都是从头开始的,所以需要有vis数组进行记录
        for (int i = 0; i < vis.size(); i++) {
            if (!vis[i] && check(grid, start, i)) {
                // 当位置合适之后,vis和grid都需要修改
                vis[i] = 1;
                grid[start][i] = 1;
                backtrace(grid, vis, start+1, ans);
                grid[start][i] = 0;
                vis[i] = 0;
            }
        }
    }

    int totalNCow(int n) {
        // write code here
        int ans = 0;
        for (int i = 0; i < n; i++) {
            vector<int> vis(n, 0);
            vis[i] = 1;
            vector<vector<int>> grid(n, vector<int>(n));
            grid[0][i] = 1;
            backtrace(grid, vis, 1, ans);
        }   
        return ans;
    }
};

全部评论

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
Rena1ssance_:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务