문제

링크

풀이

#include <iostream>
#include <vector>
using namespace std;
 
int dy[2] = {0, 1};
int dx[2] = {1, 0};
 
vector<vector<char>> board;
vector<vector<bool>> visited, used;
 
inline int c2i(char c) { return c - '0'; }
 
int backtrack(int y, int x) {
  if (y == 8) return 1;
  if (visited[y][x]) return backtrack(y+(x+1)/7, (x+1)%7);
 
  int ret = 0;
  for (int i=0; i<2; i++) {
    int ny = y + dy[i], nx = x + dx[i];
    if (nx < 0 || nx >= 7 || ny < 0 || ny >= 8) continue;
    int a = c2i(board[y][x]), b = c2i(board[ny][nx]);
    if (visited[ny][nx] || used[a][b]) continue;
    used[a][b] = used[b][a] = true;
    visited[y][x] = visited[ny][nx] = true;
    ret += backtrack(y+(x+1)/7, (x+1)%7);
    visited[y][x] = visited[ny][nx] = false;
    used[a][b] = used[b][a] = false;
  }
  return ret;
}
 
void solve(void) {
  board.assign(8, vector<char>(7));
  for (int i=0; i<8; i++) for (int j=0; j<7; j++) cin >> board[i][j];
 
  visited.assign(8, vector<bool>(7, false));
  used.assign(7, vector<bool>(7, false));
  cout << backtrack(0, 0);
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}