来源天气预报:哪位高手帮我用C语言设计一个“八皇后问题“的程序并给出程序设计的流程图 谢谢啊

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 01:32:06
希望朋友给出答案时给出相应设计的流程图 一定是图啊 不要文字注解 谢谢

八皇后问题:
问题提出: 8×8的棋盘上放置8个皇后,在同一横线、竖线、对角线上会产生冲突,
求不产生冲突即8个皇后都安全的放置方法。
这里改变NCOUNT即可以求出n皇后的n×n棋盘的放置方法
张可彦: kyany@sina.com
*/
#include "stdio.h"

#define NCOUNT 8
int nArray[NCOUNT][NCOUNT];

// 判断一个点是否是安全点
bool IsSafe(int i,int j)
{
int x=i,y=j;
while(1)
{
x -= 1;
if( x<0 )break;
y -= 1;
if( y<0)break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x += 1;
if( x>NCOUNT-1 )break;
y += 1;
if( y >NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
y-=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y -=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
return true;
}

void main()
{
int nVe=-1,nHo=0;
bool bRetry = false;
int nSol = 0;

// 清除棋盘
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
nArray[i][j] = 0;
}

while(1)
{
nVe += 1;
if( nVe>NCOUNT-1)
{// 棋盘放满,打印当前棋盘上棋子位置
nSol++;
printf("Sol %d: ",nSol);
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
if( nArray[i][j]==1)
printf("(%d,%d) ",i,j);
}
printf("\r\n");
// 回溯查找下一个可行方案
nVe -= 2;
bRetry = true;
continue;
}

int nFill = 0;
if( bRetry )
{ // 回溯计算
bRetry = false;
for( i=0;i<NCOUNT;i++)
{// 得到棋子的位置
if( nArray[nVe][i] == 1)
{
nArray[nVe][i] = 0;
nFill = i;
break;
}
}
if( nFill == NCOUNT-1)
{// 棋子在当前行已经是最后的位置
// 如果是第一行,算法结束
if( nVe == 0)return;
// 否则回溯
nVe -= 2;
bRetry = true;
continue;

}
// 从当前位置之后查找一个安全点
nFill += 1;
}

bool bFilled = false;
for( i=nFill;i<NCOUNT;i++)
{// 当前行查找一个安全点
if( IsSafe(nVe,i))
{
bFilled = true;
nArray[nVe][i] = 1;
break;
}
}
// 找不到安全点,回溯
if( !bFilled )
{
nVe -= 2;
bRetry = true;
}
}
}