• 문제

    1

  • 고민

    지나간 자리를 다시 지나갈 수 있으니 순회했던 정보를 저장하지 않고 배열을 돌아다니는 방법을 택했다. 6번 순회하는 도중의 정보를 전부 저장한 다음, 저장한 정보의 중복을 제거하면 만들 수 있는 여섯자리수를 구할 수 있는 문제였다.

  • 코드

    // https://www.acmicpc.net/problem/2210
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
      
    int map[6][6];
    vector<string> ans;
    int dx[4] = { -1, 1, 0, 0 };
    int dy[4] = { 0, 0, 1, -1 };
      
    void route(string s, int x, int y) {
    	s += map[x][y] + '0';
    	if (s.size() == 6) {
    		ans.push_back(s);
    		return;
    	}
    	for (int i = 0; i < 4; i++) {
    		int nx = x + dx[i];
    		int ny = y + dy[i];
    		if (nx >= 1 && nx <= 5 && ny >= 1 && ny <= 5) {
    			route(s, nx, ny);
    		}
    	}
    }
      
    int main() {
    	ios::sync_with_stdio;
    	for (int i = 1; i <= 5; i++) {
    		for (int j = 1; j <= 5; j++) {
    			cin >> map[i][j];
    		}
    	}
      
    	for (int i = 1; i <= 5; i++) {
    		for (int j = 1; j <= 5; j++) {
    			route("", i, j);
    		}
    	}
      
    	sort(ans.begin(), ans.end());
    	vector<string>::iterator iter;
    	iter = unique(ans.begin(), ans.end());
    	ans.erase(iter, ans.end());
      
    	cout << ans.size() << '\n';
    	return 0;
    }