N皇后问题
总提交数: 628次通过数: 428次通过率: 68.15%
内存限制: 104857600(BYTE)时间限制: 1000(MS)输入限制: 1000(行)输出限制: 1000(行)
题目描述
将 n 个皇后放置在 n × n 的棋盘上,应该如何放置皇后的位置,保证皇后彼此之间不能相互攻击。
使用回溯算法计算n 皇后问题不同的解决方案的数量。
输入第一行为一个整数n,表示皇后的数量和棋盘的规模。
样例输入输出
样例1
输入:
1
输出:
1
样例2
输入:
4
输出:
2
#include<iostream>
using namespace std;
bool isSafe(int*& queens, int row, int col) {
for (int i = 0; i < row; i++) {//( i , queens[i] )
if (col == queens[i]) {
return false;
}
else if (row-i==col-queens[i]|| row - i == queens[i]-col) {
return false;
}
}
return true;
}
void backtrack(int*& queens, int row, int& count, int n) {
if (row == n) {//0 --- n-1
count++;
return;
}
for (int i = 0; i < n; i++) {
if (isSafe(queens, row, i)) {
queens[row] = i;
backtrack(queens, row + 1, count, n);
}
}
}
int main() {
int n;
cin >> n;
int count = 0;
int* queens = new int[n];
backtrack(queens, 0, count, n);
cout << count << endl;
}
所有可能的路径
总提交数: 885次通过数: 199次通过率: 22.49%
内存限制: 10485760(BYTE)时间限制: 1000(MS)输入限制: 1000(行)输出限制: 1000(行)
题目描述
给你一个有n个节点的有向无环图(DAG),请你使用回溯算法找出所有从节点0到节点n-1的路径并输出(要求按照字典顺序输出)。
graph[i]是一个从节点i可以访问的所有节点的列表(即从节点i到节点graph[i][j]存在一条有向边)。
输入:
第一行为整数N,接下来N行为节点的列表
输出:
按字典顺序排列的若干行节点列表
示例1:
输入:graph = [[1,2], [3], [3], []]
输出:[[0,1,3], [0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
提示:
- n == graph.length
- 2 <= n <= 15
- 0 <= graph[i][j] < n
- graph[i][j] != i (即不存在自环)
- graph[i]中的所有元素互不相同
- 保证输入为有向无环图
样例输入输出
样例1
输入:
4
1 2
3
3
//该处为换行
输出:
0 1 3 //末尾有空格
0 2 3
#include<iostream>
#include<vector>
#include<string>
#include <algorithm> // 引入sort函数
using namespace std;
void backtrace(vector<vector<int>>graph, int*& road, int n, int i,int num) {//i 为当前节点号,num为第几个经过的节点
if (i == n-1) {
for (int j = 0; j < n; j++) {
cout << road[j] << ' ';
if (road[j] == n - 1)break;
}
cout << endl;
}
for (auto it = graph[i].begin(); it != graph[i].end(); it++) {
road[num + 1] = *it;
backtrace(graph, road, n, *it,num+1);
}
}
int main() {
int n;
string input;
getline(cin, input);
n = int(input[0] - '0');
vector<vector<int>>graph;
for (int i = 0; i < n; i++) {
vector<int>tmp;
string s;
getline(cin, s);
for (int j = 0; j < s.length(); j++) {
if (s[j] != ' ') {
tmp.push_back(int(s[j]-'0'));
}
}
sort(tmp.begin(), tmp.end());
graph.push_back(tmp);
}
int* road = new int[n];
road[0] = 0;
backtrace(graph, road, n, 0, 0);
}