2580번 스도쿠

이어지는 브루트포스문제이며 백트래킹으로 적절한 조건을 잘 찾아야 한다. 스도쿠문제는 1)같은 열, 2)같은 행, 3)3x3 정사각형 안에 같은 숫자가 존재해서는 안된다는 조건이 있다. 따라서 각 조건에 따라 if조건문을 만들어야 한다.
int 반환형을 void 반환형으로 바꿀수는 없는지 시도중이다.
아래는 int 반환형 DFS이다.

#include <iostream>

using namespace std;
int map[10][10];
int c[10][10];
int c2[10][10];
int c3[10][10];
int DFS(int L) {
	if (L == 81) {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				cout << map[i][j] << ' ';
			}
			cout << '\n';
		}
		return 1;
	}
	else {
		int x = L / 9;
		int y = L % 9;
		if (map[x][y] != 0) return DFS(L + 1);
		else {
			for (int i = 1; i <= 9; i++) {
				if (c[x][i] == 0 && c2[y][i] == 0 && c3[(x / 3) * 3 + y / 3][i] == 0) { //즉, 놓을 수 있으면
					c[x][i] = 1;
					c2[y][i] = 1;
					c3[(x / 3) * 3 + y / 3][i] = 1;
					map[x][y] = i;
					if(DFS(L + 1)==1) return 1;
					map[x][y] = 0;
					c[x][i] = c2[y][i] = c3[(x / 3) * 3 + y / 3][i] = 0;
				}
			}

		}
		
	}
	return 0;
}


int main() {
	ios_base::sync_with_stdio(false);
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			cin >> map[i][j];
			if (map[i][j] != 0) {
				c[i][map[i][j]] = 1;
				c2[j][map[i][j]] = 1;
				c3[(i / 3) * 3 + j / 3][map[i][j]] = 1;
			}
		}
	}
	DFS(0);
	return 0;
}
	

좋은 웹페이지 즐겨찾기