用回溯法做,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;
    }

}