题解 | #牛吃草问题#
牛吃草问题
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;
}
};
腾讯成长空间 5970人发布
