您的位置:首页 > 其它

用C写的八皇后问题

2016-12-29 00:00 211 查看
// 八皇后问题.cpp : 定义控制台应用程序的入口点。
//回溯算法

#include "stdafx.h"
#include<stdio.h>

int count = 0;

//row表示起始行,参数n表示列数,参数(*chess)[8]表示指向棋盘每一行的指针
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;//表示有
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<8&&k<8;i++,k++)
{
if(*(*(chess + i) + k) != 0)
{
flag3 = 1;
break;
}
}

//判断右上方(i为行减1列加1)
for(i = row,k = j;i>=0&&k <8;i--,k++)
{
if(*(*(chess + i) + k) != 0)
{
flag4 = 1;
break;
}
}

//判断左下方(行+1,列-1)
for(i = row,k = j;i < 8 && k >= 0;i++,k--)
{
if(*(*(chess + i) + k) != 0)
{
flag5 = 1;
break;
}
}
if(flag1|| flag2|| flag3|| flag4 ||flag5 )
{
return 0;
}
else
return 1;
}
void EightQueue(int row,int n,int (*chess)[8])//总棋盘,指向棋盘的每一行指针,即行做指针
{
int chess2[8][8],i,j;//临时的棋盘
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
chess2[i][j] = chess[i][j];//主棋盘赋值给临时棋盘临时的棋盘
}
}
//列做数组,打印出来
if(row == 8)
{
printf("第%d种\n",count+1);
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 < n;j++)
{
if(notDanger(row ,j,chess))//判断是否危险
{
for(i = 0;i < 8;i++)
{
*(*(chess2 + row) + i) = 0;//整行(所有的列)都赋值为0
}

*(*(chess2 + row) + j) = 1;//row行j列
EightQueue(row + 1,n,chess2);
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int chess[8][8],i,j;
//初始化,填0表示没有东西,1表示皇后
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
chess[i][j] = 0;
}
}
EightQueue(0,8,chess);
printf("总共有%d种解决方法!\n\n",count);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: