用回溯法做,fireworks函数是回溯函数,如果填满了,且步数更少,就记录结果。重载了加减法方便一点。
origin数组是记录的杂物,用于checkstone函数确保烟花没有放在杂物上面。
#include <iostream>
#include<vector>
using namespace std;
int minresult;
vector<int>final;
vector<vector<char>> operator+(const vector<vector<char>>a,
const vector<vector<char>>b) {
int n = a.size(), m = a[0].size();
vector<vector<char>>result(n, vector<char>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
result[i][j] = a[i][j] + b[i][j] - '0';
}
}
return result;
}
vector<vector<char>> operator-(const vector<vector<char>>a,
const vector<vector<char>>b) {
int n = a.size(), m = a[0].size();
vector<vector<char>>result(n, vector<char>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
result[i][j] = a[i][j] - b[i][j] + '0';
}
}
return result;
}
bool checkfull(vector<vector<char>>a) {
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[0].size(); j++) {
if (a[i][j] == '0') {
return false;
}
}
}
return true;
}
bool checkstone(vector<vector<char>>& origin,vector<vector<char>>& a){
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[0].size(); j++) {
if(origin[i][j]=='1'&&a[i][j]=='1'){
return false;
}
}
}
return true;
}
void fireworks(int q, int result, vector<vector<vector<char>>>& plans,
int index,
vector<vector<char>> states, vector<int>& plancode,vector<vector<char>>& origin) {
if (checkfull(states)) {
if (result < minresult) {
minresult = result;
final = plancode;
}
return;
}
for (int i = index; i < q; i++) {
if (checkstone(origin,plans[i])) {
states = states + plans[i];
plancode.push_back(i + 1);
fireworks(q, result + 1, plans, index + 1, states, plancode,origin);
states = states - plans[i];
plancode.pop_back();
}
}
}
int main() {
int n, m, q;
cin >> n >> m >> q;
vector<vector<char>> states(n, vector<char>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> states[i][j];
}
}
vector<vector<vector<char>>>plans(q, vector<vector<char>>(n, vector<char>(m)));
for (int i = 0; i < q; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
cin >> plans[i][j][k];
}
}
}
vector<int>plancode;
minresult = q + 1;
fireworks(q, 0, plans, 0, states, plancode,states);
if (minresult < q + 1) {
cout << minresult << endl;
for (int i : final) {
cout << i << ' ';
}
} else {
cout << -1;
}
}

京公网安备 11010502036488号