用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; }