在打印出找到的第一个解决方案后,我想打印找到第一个解决方案所花费的时间,如下所示。
输入 N:4
1 3 0 2
时间:0.001秒
但是,当我输入 30 作为输入时,它需要异常长的时间,就好像它处于无限循环中一样。此外,当我输入 31 作为输入时,我花了将近 15 秒,但打印出来的时间只有 0.002 秒。我认为我应该更改时钟功能的位置,但由于代码在打印出第一个解决方案后退出程序,因此我决定将它们放在哪里变得非常棘手。
任何帮助将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int put_queens(int column, int size, int* array);
int check_safe(int column, int row, int* array);
void print_sol(int size, int* array);
int main (void){
int size, flag;
int* array;
clock_t t;
printf("Input N: ");
scanf("%d",&size);
array = (int*) calloc(size, sizeof(int));
t = clock();
flag = put_queens(0,size, array);
if(flag){
printf("No solution");
t = clock() - t;
printf("\nTime: %.3fsec",((float)t)/CLOCKS_PER_SEC);
free(array);
}
return 0;
}
int put_queens(int column, int size, int* array){
clock_t t;
t = clock();
int row, flag;
for( row = 0; row < size; row++ ){
if( check_safe(column, row, array) ){
array[column] = row;
if(column == size - 1){
print_sol(size, array);
t = clock()-t;
printf("\nTime: %.3fsec",((float)t)/CLOCKS_PER_SEC);
free(array);
exit (0);
}
else{
put_queens(column + 1, size, array);
}
}
}
if(row == size && column == size - 1){
flag = 1;
}
return flag;
}
int check_safe(int column, int row, int* array){
int index;
for(index = 0; index < column; index++){
if((array[index] == row ) || (abs(array[index]-row)==abs(column - index))){
return 0;
}
}
return 1;
}
void print_sol(int size, int* array){
int column;
for(column = 0; column < size; column++ ){
printf("%3d", array[column]);
}
}