首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这个程序看不懂,多谢了!

2012-03-06 
这个程序看不懂,谢谢了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#includestdio.hintrow[8],s0boolsafe(intx,i

这个程序看不懂,谢谢了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include   <stdio.h>
int   row[8],   s   =   0;
bool   safe(int   x,   int   y)
{
                for   (int   i   =   1;   i   <=   y;   i++)
                                if   (row[y   -   i]   ==   x   ||   row[y   -   i]   ==   x   -   i   ||   row[y   -   i]   ==   x   +   i)   return   false;
                return   true;
}
void   putboard()
{
                printf( "\nSolution   #%d:\n---------------------------------\n ",   ++s);
                for   (int   y   =   0;   y   <   8;   printf( "|\n---------------------------------\n "),   y++)
                                for   (int   x   =   0;   x   <   8;   printf(x++   ==   row[y]   ?   "|   Q   "   :   "|       "));
}
int   main(int   y)
{
                for   (int   x   =   0;   x   <   8;   x++)
                                if   (safe(row[y   -   1]   =   x,   y   -   1))
                                                if   (y   <   8)   main(y   +   1);
                                                else   putboard();
return   0;
}

我知道main()函数里可以用参数,但是其中的y并没有赋过值,这个程序是如何运行起来的呢

[解决办法]
int main( int argc, char **argv )
程序初始运行时,argv是参数列表, 第一个参数为程序名,argc为参数个数。

int main( int y )
y=1,表示argv只有程序名一个参数(没传进来)
[解决办法]
y的初值为1
[解决办法]
大概是这样的 y是用来控制递归深度的(行号),也就是皇后个数的,x是当前行皇后所在的位置(列号),
for (int i = 1; i <= y; i++)
if (row[y - i] == x || row[y - i] == x - i || row[y - i] == x + i)
;;;;;;;
上面这个循环是用来判断当前行上的皇后是否与前面所产生的皇后所冲突,如果不冲突,接着排下一个皇后的位置,每调用main()一次,产生一个row[8]数组.上面这个算法一共调用了mian函数1965次,这个数目真不小啊
[解决办法]
上面采用的应该是回溯法吧
不知道说对了没,呵呵
[解决办法]
判断每行每列还对角线上是否存在一个以上的皇后。

热点排行