[SW Expert] #2819 격자판의 숫자 이어붙이기 :: 잡다한 프로그래밍
반응형

링크
https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


1. 해결방법

모든 지점을 상 하 좌 우로 들리면서 7번째로 도착하면 set에 저장하면 자동으로 중복을 제거해 줄 수 있을 거라고 생각했다. 따라서 모든 지점을 상 하 좌 우로 들리는 방법을 코드로 구현하려 하였으나 결국 검색하여 찾아보니 dfs와 bfs방법을 사용한다고 한다. 이 문제의 해결방법으로는 dfs를 사용했고 dfs와 bfs는 따로 나중에 알고리즘에 추가하도록 할 예정이다.


2. 코드

#include <string>
#include <math.h>
#include <iostream>
#include <set>
using namespace std;

int num = 0;
int arr[4][4];
set<int> setary;
void dfs(int x, int y, int val, int dept) {
	int nx[4] = { 0, 0, -1, 1 };
	int ny[4] = { -1, 1, 0, 0 };
	for (int i = 0; i < 4; i++) {
		if (dept == 7) {
			setary.insert(val);
			return;
		}
		int dx = x + nx[i];
		int dy = y + ny[i];

		if (dx < 0 || dx >= 4 || dy < 0 || dy >= 4) continue;
		else {
			dfs(dx, dy, val * 10 + arr[dy][dx], dept + 1);
		}
	}
}
int main()
{
	cin >> num;
	for (int i = 1; i <= num; i++) {
        setary.clear();
		for (int j = 0; j < 4; j++) {
			for (int k = 0; k < 4; k++) {
				cin >> arr[j][k];
			}
		}
		for (int j = 0; j < 4; j++) {
			for (int k = 0; k < 4; k++) {
				dfs(j, k ,arr[j][k], 1);
			}
		}
		cout << "#"<< i << " " << setary.size() << endl;
	}
}

main함수에서 dfs(j, k, arr[j][k], 1)이 부분을 처음에 0, 0 arr[j][k], 1로 하였다 이때 값이 항상 같은 오류가 생겼고 이를 j k로 수정하며 해결하였다.

반응형

+ Recent posts