|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- //八皇后问题
- #include<stdio.h>
- int count=1;
- int notdanger(int row,int j,int (*chess)[8])
- {
- int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
- for (i=0;i<8;i++) //判断棋子所在的列是否危险
- {
- if(chess[i][j]!=0)
- {
- flag1=1; //1表示有危险
- break;
- }
- }
- for (i=row,k=j;i>=0&&k>=0;i--,k--)//判断左上方是否危险
- {
- if(chess[i][k]!=0)
- {
- flag2=1;
- break;
- }
- }
- for(i=row,k=j;i>=0&&k<8;i--,k++)//判断右上方是否危险,这里不能是小于等于
- {
- if(chess[i][k]!=0)
- {
- flag3=1;
- break;
- }
- }
- for(i=row,k=j;i<8&&k>=0;i++,k--)//判断左下方是否危险
- {
- if(chess[i][k]!=0)
- {
- flag4=1;
- break;
- }
- }
- for(i=row,k=j;i<8&&k<8;i++,k++)//判断右下方是否危险
- {
- if(chess[i][k]!=0)
- {
- flag5=1;
- break;
- }
- }
- if(flag1||flag2||flag3||flag4||flag5)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
- void eightgueen(int row,int col,int (*chess)[8])
- {
- int chess2[8][8],i,j;
- for (i=0;i<8;i++) //用chess2保存之前赋过1的棋子
- {
- //不然递归调用时chess2又被全部置0
- for (j=0;j<8;j++)
- chess2[i][j]=chess[i][j];
- }
- if(row==8) //到第八行就输出
- {
- printf("第%d种\n",count);
- for (i=0;i<8;i++)
- {
- for (j=0;j<8;j++)
- printf("%d ",chess2[i][j]);
- printf("\n");
- }
- printf("\n");
- count++;
- } else
- {
- for (j=0;j<col;j++)//先判断每一列上的数是否危险
- {
- if(notdanger(row,j,chess2))
- {
- for(i=0;i<8;i++)
- chess2[row][i]=0; //将不危险的那一整列(除了那row行)先赋值为0
- chess2[row][j]=1;
- eightgueen(row+1,col,chess2);//如果不危险,继续往下一行
- }
- }
- }
- }
- int main()
- {
- int i,j,chess[8][8];
- for (i=0;i<8;i++)
- {
- for (j=0;j<8;j++) //先全部赋值为0
- chess[i][j]=0;
- }
- eightgueen(0,8,chess);
- return 0;
- }
复制代码
是啊,但是这个函数被递归调用了,所以执行了很多次if-else判断
|
|