八皇后问题,重奖100分!!考试要用的,非常紧急!!
我编写的八皇后问题,为什么编译时没有错误但执行的时候什么都没得到?(就是只接显示press any key to continue,按一个任意键就退出了)
#include <stdio.h>
int count=0; //当前正在处理的行
void solve (int (*queen_square)[8]);
void queen_insert (int col,int (*queen_square)[8]);
void queen_remove (int col,int (*queen_square)[8]);
void print (int (*queen_square)[8]);
int is_solved (int (*queen_square)[8]);
int no_queen (int col,int (*queen_square)[8]);
void main ()
{
int queen_square[8][8]; //棋盘数组0表示无皇后,1表示有皇后
for (int row=0;row <8;row++) //初始化
{
for (int col=0;col <8;col++)
{
queen_square[row][col]=0;
}
}
solve(queen_square);
}
void solve (int (*queen_square)[8]) //递归函数。返回条件为:找到一个解或者当前行无法放置皇后
{
if (is_solved(queen_square)) //找到一个解,打印之
{
print(queen_square);
}
else
{
for (int col=0;col <8;col++)
{
if (no_queen(col,queen_square)) //如果这个位置没有被别的皇后所攻击
{
queen_insert(col,queen_square); //在这里放一个皇后
solve(queen_square); //继续
queen_remove(col,queen_square); //递归退出后返回至此
}
}
}
}
void queen_insert (int col,int (*queen_square)[8]) //在当前位置放一个皇后
{
queen_square[count][col]=1;
++count;
}
void queen_remove (int col,int (*queen_square)[8]) //移走当前位置的皇后
{
queen_square[count][col]=0;
--count;
}
void print (int (*queen_square)[8]) //打印一个方案
{
for (int i=0;i <8;i++)
for (int j=0;j <8;j++)
{
if (queen_square[i][j]==0)
printf( "@ ");
else
printf( "x ");
}
printf( "\n ");
}
int is_solved (int (*queen_square)[8]) //判断是否找到一个方案
{
if (count==8)
{
return 1;
}
else
return 0;
}
int no_queen (int col,int (*queen_square)[8]) //判断当前位置是否被别的皇后攻击
{
int ok=1;
int i;
for (i=0;ok && i <count;i++) //检查当前位置正上方的格子有无皇后
{
if (queen_square[i][col]==1)
{
ok=0;
}
}
for (i=1;ok && count-i> =0 && col-i> =0;i++) //检查当前位置左上对角线方向有无皇后
{
if (queen_square[count-i][col-i]==1)
{
ok=0;
}
}
for (i=1;ok && count-i> =0 && col+i <8;i++) //检查当前位置右上对角线方向有无皇后
{
if (queen_square[count-i][col+i]==1)
{
ok=0;
}
}
return ok;
}
[解决办法]
#include <iostream>
#include <stdlib.h>
using namespace std;
int a[8];
void display()
{ static int count=0;
int i,j;
cout < < "NO. " < <++count < < ": " < <endl;
for (i=0;i <8;i++)
{ for (j=0;j <8;j++)
if (a[i]==j)
cout < < "Q ";
else
cout < < "* ";
cout < <endl; }}
int check_list(int i,int r)
{int j;
for (j=0;j <i;j++)
{if (a[j]==r || a[j]+j==i+r || a[j]-j==r-i)
return 0;} return 1;}
void playwork(int i)
{ int r;
if (i==8) display();
else
for (r=0;r <8;r++)
if (check_list(i,r))
{ a[i]=r;
playwork(i+1); } }
int main()
{playwork(0);
cout < < '\n ' < < "## VOER ## " < <endl;
return 0;}
[解决办法]
跑的最慢的 ....
#include <stdio.h>
#include <string.h>
#define N(10)
#define O(o)f[j] o f[N+i+j] o f[4*N+i-j]
int f[ 5 * N ];
void slove( int i , int j )
{
for(j=1;j <=N;++j) i> N?printf( "%c%-2d ",j==1?(++f[0], '\n '): ' ',f[j]):!(O(|))?(O(=)=i,slove(i+1,0),O(=)=0):0;
}
int main()
{
slove(1,0);
printf( "\ncount==%d\n " , f[0] );
return 0;
}
[解决办法]
编译没问题,运行出错,那太正常了,逻辑错误是编译器检查不出来的,不过以前自己写了个8皇后的程序,可以看一下.
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
using namespace std;
void queen(int** array, int row, FILE* fp);
bool isAvailable(int** array, int y, int x);
bool isResult(int** array);
int main(int arg, char** argv) {
int** array;
// 分配空间
array = new int*[8];
for (int i = 0; i < 8; i++) {
array[i] = new int[8];
}
// 初始化皇后
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
array[i][j] = 0;
}
}
FILE* fp = fopen( "data.txt ", "w ");
queen(array, 0, fp);
fclose(fp);
// 释放空间
for (int i = 0; i < 8; i++) {
delete[] array[i];
}
delete array;
array = NULL;
return 0;
}
void queen(int** array, int row, FILE* fp) {
static int size = 0;
if (row > 7) {
return;
}
//int i = row;
for (int j = 0; j < 8; j++) {
// 如果合法
if (isAvailable(array, row, j)) {
array[row][j] = 1;
// 当前位置合法,赋值后,进入下一行
queen(array, row + 1, fp);
// 如果退回来后不是结果,则把刚设置的当前位置重新赋值为0
// 是结果,则打印出来
if (isResult(array)) {
// 把结果写入文件
fputc( '\n ', fp);
fputs( "*********************************** ", fp);
fprintf(fp, " %d ", size++);
fputs( "*********************************** ", fp);
fputc( '\n ', fp);
for (int m = 0; m < 8; m++) {
for (int n = 0; n < 8; n++) {
if (array[m][n] == 1) {
fputc( '# ', fp);
fputc( ' ', fp);
fputc( ' ', fp);
} else {
fputc( 'O ', fp);
fputc( ' ', fp);
fputc( ' ', fp);
}
}
fputc( '\n ', fp);
}
}
array[row][j] = 0;
}
}
}
bool isAvailable(int** array, int row, int column) { // 第y行,x列
int i, j;
// 检查y行
for (i = 0; i < 8; i++) {
if (array[row][i] != 0) {
return false;
}
}
// 检查x列
for (j = 0; j < 8; j++) {
if (array[j][column] != 0) {
return false;
}
}
// 检查对角向左上
i = row;
j = column;
while (i > = 0 && j > = 0) {
if (array[i][j] != 0) {
return false;
}
i--;
j--;
}
// 检查对角向右上
i = row;
j = column;
while (i > = 0 && j < 8) {
if (array[i][j] != 0) {
return false;
}
i--;
j++;
}
// 检查对角向左下
i = row;
j = column;
while (i < 8 && j > = 0) {
if (array[i][j] != 0) {
return false;
}
i++;
j--;
}
// 检查对角向右下
i = row;
j = column;
while (i < 8 && j < 8) {
if (array[i][j] != 0) {
return false;
}
i++;
j++;
}
return true;
}
bool isResult(int** array) {
int size = 0; // 皇后个数
// 统计皇后个数
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (array[i][j] != 0) {
size++;
}
}
}
// 没有8个皇后,说明不是结果
if (size != 8) {
return false;
}
return true;
}
[解决办法]
gdckwxiao_swjtu() ( 一级(初级)) 信誉:100 2007-6-28 17:33:50 得分:0
看上面的程序都好长啊!我们老师有一个较简单的方法,在这介绍给你,可能迟了,不过学点还是好的.
#include "stdio.h "
#include "math.h "
int row[8]; //数组row[1]~row[8]存储第一列至第八列皇后的行号n1,n2,...,n8
void arrange(int k) //安排第k列至第八列皇后
{ int i,j;
if(k> 8)
{for(i=1;i <=8;i++)printf( "%2d ",row[i]); //k> 8则应该输出各列皇后的行号
printf( "\n ");return;
}
for(j=1;j <=8;j++) //试探第k列的每一个行号
{ for(i=1;i <k;i++)if(row[i]==j||(k-i)==abs(row[i]-j))break;
if(i> =k){row[k]=j; //i> =k说明第k列的第j行可用,则放置一个皇后
arrange(k+1); //安排第k+1列至第8列皇后
}
}
}
void main()
{
arrange(1);
}
------------------------------
这个太牛X了
[解决办法]
给大家分享一个一行解决问题的八皇后代码:
#include <stdio.h>
#define q(o) a[j]o[j+i+7]o[j-i+31]
int a[39];
void main(int i,int j)
{
bool fk=false;
static num=0;
for(j=9;--j;i> 8?fk=true,printf( "%2d ",a[j]):q(|a)||(q(=a)=i,main(i+1,j),q(=a)=0));
if(fk) printf( "\t%d\n ",++num);
}
输出每一行八个数字,代表每个皇后在那一行的位置.