心血来潮。,用C写下大学入门C语言时的经典算法。
八皇后问题:在8*8格子里放八个皇后(棋子),使其不能互相攻击(八个棋子不能在同一行,同一列,或者同一斜线)
核心思想:走不通,回头 。
实现:递归,回溯
代码实现如下:
// // main.c // queen // // Created by 南瓜不说话 on 2017/9/19. // Copyright © 2017年 南瓜不说话. All rights reserved. // #include <stdio.h> #include <stdbool.h> #include <stdlib.h> int n; int arr[8]; int x[8]; int sum; int attack(int k) { for(int j=1;j<k;j++) if(k-j==abs(arr[j]-arr[k])||arr[j]==arr[k]) return 0; return 1; } //void zx() //{ // x[1]=abs(x[1]); //} // void backStart(int k){ if(k>n){ for(int i=1;i<=n;i++) printf(" %d",arr[i]); printf(" "); sum++; }else{ for(int i=1;i<=n;i++ ){ arr[k]=i; if(attack(k)){ backStart(k+1); } } } } int main(int argc, const char * argv[]) { n=8; // arr; sum=0; backStart(1); printf("sum=%d ",sum); return 0; }
问题:在windows下编译结果是正确的,在mac下,必须写zx()函数才编译正确,可能是我mac下C的库有问题,有待验证。。