Use this to learn the idea, then write your own version.
1class Solution {2 public:3 int countCombinations(vector<string>& pieces,4 vector<vector<int>>& positions) {5 const int n = pieces.size();6 unordered_set<long long> hashedBoards;7 8 9 10 11 vector<vector<pair<int, int>>> pieceMovesList;12 13 getPieceMovesList(pieces, 0, {}, pieceMovesList);14 15 for (const vector<pair<int, int>>& pieceMoves : pieceMovesList)16 dfs(positions, n, pieceMoves, (1 << n) - 1, hashedBoards);17 18 return hashedBoards.size();19 }20 21 private:22 const unordered_map<string, vector<pair<int, int>>> kPieceToMoves{23 {"rook", {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}},24 {"bishop", {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}},25 {"queen",26 {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}}};27 28 29 void getPieceMovesList(const vector<string>& pieces, int i,30 vector<pair<int, int>>&& path,31 vector<vector<pair<int, int>>>& pieceMovesList) {32 if (i == pieces.size()) {33 pieceMovesList.push_back(path);34 return;35 }36 for (const pair<int, int>& move : kPieceToMoves.at(pieces[i])) {37 path.push_back(move);38 getPieceMovesList(pieces, i + 1, std::move(path), pieceMovesList);39 path.pop_back();40 }41 }42 43 44 void dfs(const vector<vector<int>>& board, int n,45 const vector<pair<int, int>>& pieceMoves, int activeMask,46 unordered_set<long long>& hashedBoards) {47 if (activeMask == 0)48 return;49 hashedBoards.insert(getHash(board));50 for (int nextActiveMask = 1; nextActiveMask < 1 << n; ++nextActiveMask) {51 if ((activeMask & nextActiveMask) != nextActiveMask)52 continue;53 54 55 vector<vector<int>> nextBoard = board;56 57 58 for (int i = 0; i < n; ++i)59 if (nextActiveMask >> i & 1) {60 nextBoard[i][0] += pieceMoves[i].first;61 nextBoard[i][1] += pieceMoves[i].second;62 }63 64 65 if (getUniqueSize(nextBoard) < n)66 continue;67 68 69 if (ranges::all_of(nextBoard, [](const vector<int>& pos) {70 return 1 <= pos[0] && pos[0] <= 8 && 1 <= pos[1] && pos[1] <= 8;71 }))72 dfs(nextBoard, n, pieceMoves, nextActiveMask, hashedBoards);73 }74 }75 76 long long getHash(const vector<vector<int>>& board) {77 long long hash = 0;78 for (const vector<int>& pos : board)79 hash = (hash * 64) + ((pos[0] - 1) << 3) + (pos[1] - 1);80 return hash;81 }82 83 int getUniqueSize(const vector<vector<int>>& board) {84 unordered_set<int> unique;85 for (const vector<int>& pos : board)86 unique.insert(pos[0] * 8 + pos[1]);87 return unique.size();88 }89};90