Re: [课程] 11/18 C2010 助教课预定内容

楼主: pp5438 (QQ)   2010-11-18 19:28:01
改自课本p152. 八皇后问题
题目要求已经被我改得有点不一样 大家可以看看这个code和课本上的code有何不同
题目: 在一个8*8的棋盘上 是否有一个方法可以放入八个皇后
并且皇后与皇后之间不会互相攻击到
如果有解 则把这个解的每一排(每一个row)的皇后位置印出来
执行结果:
1 5 8 6 3 7 2 4
=========================== Code =============================================
#include<stdio.h>
int find(int i,int queen[]) // 尝试在第i个row的各个coloumn放入皇后
{
int j,k;
if(i==8) // 终端条件 如果前8个row的皇后位置都已经猜完
// 并且猜测结果之间没有互相冲突
{
for(j=0;j<8;j++) printf("%d ",queen[j]+1);
printf("\n");
return 1;
}
for(j=0;j<8;j++) // 把皇后放在第 i 个row的coloumn 0~7 看看是否有解
{
for(k=0;k<i;k++) // 检查是否跟之前的某个皇后互相可以攻击到
if(queen[k]==j ||
queen[k]+(i-k)==j ||
queen[k]-(i-k)==j
)
break;
if(k==i) // 如果与之前的皇后皆没有冲突 则去问"下一层"是否有解
// 如果有冲突则在目前状况下皇后不可能被放在(i,j)这格
{
queen[i]=j;
if(find(i+1,queen)==1) return 1;
// 如果下一层找到一个解 则"很高兴地"说 "我找到解了!!"
}
}
return 0; // 怎么样都找不到解 莫可奈何只好自认倒楣说目前的情况没有解
}
int main()
{
int queen[8]={0};
find(0,queen); // 从第0个row开始猜每个皇后的位置
scanf(" ");
return 0;
}

Links booklink

Contact Us: admin [ a t ] ucptt.com