心血來潮。,用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("\n"); 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\n",sum); return 0; }
問題:在windows下編譯結果是正確的,在mac下,必須寫zx()函數才編譯正確,可能是我mac下C的庫有問題,有待驗證。。