재귀호출을 통하여, 답안을 도출하려 하는데요,
예제에 나온 답안은 도출이 되는데, 제출을 하면 자꾸 오답으로 나타납니다.
괜찮으시다면 원인을 찾는데 도움을 부탁드리겠습니다.
소스는 C++ 이며 아래와 같습니다.
#include < iostream >
using namespace std;
static const int SIZE = 12; // 체스맵 사이즈
class Map // 하나의 체스맵
{
public:
int map[SIZE][SIZE];
int N;
Map(int N)
{
this->N = N;
}
Map(Map* obj)
{
N = obj->N;
for (int i=0; i<N; i++)
{
for (int j=0; j<N; j++)
{
map[i][j] = obj->map[i][j];
}
}
}
// 체스맵의 x,y 지점에 1로 셋팅
void setQueen(int x, int y)
{
map[x][y] = 1;
}
};
class Nqeen
{
int N;
int count;
public:
Nqeen(int n)
{
N = n;
count = 0;
}
// 몇개의 케이스가 있는지 답안을 도출하는 함수
int getCaseCount()
{
if (N == 1)
{
return 1;
}
/*int roof = N/2;
int ret = 0;
for (int i=0; i<roof; i++)
{
Map* map = new Map(N);
map->setQueen(i,0);
makeMap(map, 1);
}
ret = count*2;
if (N%2 == 1)
{
count = 0;
Map* map = new Map(N);
map->setQueen(N/2+1,0);
makeMap(map, 1);
ret += count;
}*/
// 맨 윗줄 N 개에 대해 탐색을 시도
for (int i=0; i<N; i++)
{
Map* map = new Map(N);
map->setQueen(i,0); // 맨 윗줄에 퀸을 하나 위치시키고
makeMap(map, 1); // 그 다음 줄 탐색(맵을 만든다)
}
return count;
}
void makeMap(Map* map, int y)
{
bool check;
for (int i=0; i<N; i++) // i는 x좌표
{
check = isEnableCheck(map, i, y); // i,y 에 퀸이 올수 있는지 검사
if (check == true)
{
if (y == N-1) // 마지막 줄까지 맵을 만들었다면
{
count++; // 전체 찾은 갯수 ++
if (count == N) // 목표한 갯수만큼 찾았다면
{
delete map;
break;
}
}
else // 아직 탐색을 더 해야 한다면 (다음줄로 진행)
{
Map* newMap = new Map(map);
newMap->setQueen(i, y);
makeMap(newMap, y+1);
}
}
if (i == N-1) delete map;
}
}
bool isEnableCheck(Map* map, int x, int y)
{
int i,j;
for (i=x+1; i<N; i++)
{
if (map->map[i][y] == 1)
{
return false;
}
}
for (i=x-1; i>=0; i--)
{
if (map->map[i][y] == 1)
{
return false;
}
}
for (i=y+1; i<N; i++)
{
if (map->map[x][i] == 1)
{
return false;
}
}
for (i=y-1; i>=0; i--)
{
if (map->map[x][i] == 1)
{
return false;
}
}
for (i=x+1, j=y+1; i<N && j<N; i++, j++)
{
if (map->map[i][j] == 1)
{
return false;
}
}
for (i=x-1, j=y-1; i>=0 && j>=0; i--, j--)
{
if (map->map[i][j] == 1)
{
return false;
}
}
for (i=x+1, j=y-1; i<N && j>=0; i++, j--)
{
if (map->map[i][j] == 1)
{
return false;
}
}
for (i=x-1, j=y+1; i>=0 && j<N; i--, j++)
{
if (map->map[i][j] == 1)
{
return false;
}
}
return true;
}
};
int main()
{
//FILE* f = freopen("input.txt", "r", stdin);
int i, testcaseCount;
cin >> testcaseCount;
int N;
int ret=0;
for (i=0; i<testcaseCount; i++)
{
cin >> N;
Nqeen obj(N);
ret = obj.getCaseCount();
cout << ret << endl;
}
return 0;
peace729
안녕하세요, NQUEEN 문제를 풀다 어려움이 있어 질문 드립니다.
재귀호출을 통하여, 답안을 도출하려 하는데요,
예제에 나온 답안은 도출이 되는데, 제출을 하면 자꾸 오답으로 나타납니다.
괜찮으시다면 원인을 찾는데 도움을 부탁드리겠습니다.
소스는 C++ 이며 아래와 같습니다.
#include < iostream >
using namespace std;
static const int SIZE = 12; // 체스맵 사이즈
class Map // 하나의 체스맵
{
public:
};
class Nqeen
{
int N;
int count;
public:
};
int main()
{
//FILE* f = freopen("input.txt", "r", stdin);
}
감사합니다.
10년 전