你的程序能运行出合理的结果吗?void queue(int n)中的m就没赋初值。
有 m 这一行改为:
int i,k,m=0;
即可。
试运行结果:
(输入)8
92
#include<stdio.h> #include<math.h> #include <stdbool.h> bool place_ok( int *px, int k ) { int i; for ( i = 1; i < k; i++ ) { if ( px[k] == px[i] || abs( k - i ) == abs( px[k] - px[i] ) ) return false; } return true; } void queen( int n ) { int x[n + 1]; int i, k = 1, m = 0; for ( i = 1; i <= n; i++ ) x[i] = 0; while ( k >= 1 ) { x[k]++; while ( x[k] <= n && !place_ok( x, k ) ) x[k]++; if ( x[k] > n ) { x[k] = 0; k--; } else if ( k == n ) { m++; } else { k++; } } if ( n == 1 ) printf( "1\n" ); else printf( "%d\n", m ); } int main(void) { int n; printf( "Input n:" ); scanf( "%d", &n ); queen( n ); return 0; }
#include<stdio.h> #include<math.h> #include <stdbool.h> bool place_ok( int *px, int k ) { int i; for ( i = 1; i < k; i++ ) { if ( px[k] == px[i] || abs( k - i ) == abs( px[k] - px[i] ) ) return false; } return true; } int queen( int n ) { int x[n + 1]; int i, k = 1, m = 0; for ( i = 1; i <= n; i++ ) x[i] = 0; while ( k >= 1 ) { x[k]++; while ( x[k] <= n && !place_ok( x, k ) ) x[k]++; if ( x[k] > n ) { x[k] = 0; k--; } else if ( k == n ) { m++; } else { k++; } } return n == 1 ? 1 : m; } int main(void) { int n; printf( "Input n:" ); scanf( "%d", &n ); printf( "Methods: %d\n", queen( n ) ); return 0; }