몬테카를로 n-queen문제좀 도와주세요 ㅠ
#include
#include
#include
#include
int n;
int *queen;
FILE *fn, *ft;
int promising(int m)
{
int i=0, promising;
promising = 1;
while(i
if(abs( queen[i]-queen[m]) == abs(i-m) )
promising = 0;
if(queen[i]==queen[m])
promising = 0;
i++;
}
return promising;
}
void fillRnd(int m)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < m; i++) {
queen[i] = rand()%n;
while(promising(i)==0)
queen[i] = rand()%n;
}
}
int promisingRnd(int m)
{
int i, j;
for(i=0; i
{
for(j=i+1; j
{
if(abs( queen[i]-queen[j]) == abs(i-j) )
return 0;
if(queen[i]==queen[j])
return 0;
}
}
return 1;
}
void queens(int i)
{
int j;
if(promising(i)) {
if(i==n-1) {
for(j=0; j
fprintf(ft, "%d\n", queen[j]);
exit(-1);
}
else {
for(j=0; j
queen[i+1] = j;
queens(i+1);
}
}
}
}
void main()
{
int i, j;
char input[100];
printf("input file name? ");
scanf("%s", input);
fn = fopen(input, "r");
ft = fopen("output.txt", "w");
fscanf(fn, "%d", &n);
queen = (int *)malloc (sizeof(int)*(n));
while(1) {
fillRnd(n-5);
//if(promisingRnd(n-5)==1)
queens(n-6);
}
}
정도로 코드 짜봤는데.. 자꾸 무한루프도네여
밑에서 fillRnd하면서 겹치는지 안겹치는지 확인해준게 문젠가..
promisingRnd는 만약 그냥 fillRnd해서 채워넣은다음 채워넣은것들을 확인하는 함수로 만들어봤습니다..
도와주세요..
코드가 제대로 안들어갓는데 수정하는 곳을 못찾겟네요 ㅠ
#include
#include
#include
#include
int n;
int *queen;
FILE *fn, *ft;
int promising(int m)
{
int i=0, promising;
promising = 1;
while(i if(abs( queen[i]-queen[m]) == abs(i-m) )
promising = 0;
if(queen[i]==queen[m])
promising = 0;
i++;
}
return promising;
}
void fillRnd(int m)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < m; i++) {
queen[i] = rand()%n;
while(promising(i)==0)
queen[i] = rand()%n;
}
}
int promisingRnd(int m)
{
int i, j;
for(i=0; i {
for(j=i+1; j {
if(abs( queen[i]-queen[j]) == abs(i-j) )
return 0;
if(queen[i]==queen[j])
return 0;
}
}
return 1;
}
void queens(int i)
{
int j;
if(promising(i)) {
if(i==n-1) {
for(j=0; j fprintf(ft, "%d\n", queen[j]);
exit(-1);
}
else {
for(j=0; j queen[i+1] = j;
queens(i+1);
}
}
}
}
void main()
{
int i, j;
char input[100];
printf("input file name? ");
scanf("%s", input);
fn = fopen(input, "r");
ft = fopen("output.txt", "w");
fscanf(fn, "%d", &n);
queen = (int *)malloc (sizeof(int)*(n));
while(1) {
fillRnd(n-5);
//if(promisingRnd(n-5)==1)
queens(n-6);
}
}
코드 태그를 넣어보십시오..
< 와 > 사이에 code
- 어제보다 나은 오늘, 오늘보다 나은 내일.
댓글 달기