八皇后C語言實現

ngmm 9年前發布 | 802 次閱讀 C/C++

    //
// main.cpp
// EightQueens
//
// Created by liujan on 10/24/14.
// Copyright (c) 2014 liujan. All rights reserved.
//

#include <iostream>  
#include "stack"  
using namespace std;  
bool isvisited[30][30];  
int Count = 0;  
int n;  

//判斷是否可以從當前位置移動到x,y這個位置  
bool canMove(int x, int y){  
    if (isvisited[x][y])  
        return false;  
    for (int i = 0; i < n; i++){  
        for (int j = 0; j < n; j++){  
            if (isvisited[i][j] && abs(x-i) == abs(y-j))  //對角線或已經訪問過  
                return false;  
            else if(isvisited[x][j]) {  //相同行  
                return false;  
            }  
            else if (isvisited[i][y]) //相同列  
                return false;  
        }  
    }  
    return true;  
}  

//移動到下一位置  
bool moveQueens(int x, int y){  
    if (Count == n){  //走完最后一個節點,則輸出結果  
        for (int i = 0; i < n; i++){  
            for (int j = 0; j < n; j++) {  
                if (isvisited[i][j])  
                    cout << 1 << " ";  
                else  
                    cout << 0 << " ";  
            }  
            cout << endl;  
        }  
        cout << endl;  
        return true;  
    }  
    else {  
        for (int i = y; i < n; i++){  
            if (canMove(x, i)){  
                isvisited[x][i] = true;  
                Count ++;  
                moveQueens(x+1, 0);  

                isvisited[x][i] = false;  //回溯  
                Count --;  
            }  
        }  
        return false;  
    }  
}  


int main(int argc, const char * argv[]) {  
    while(cin >> n){  
        if (n <= 0 )  
            continue;  
    // insert code here...  
        for (int i = 0; i < n; i++)  
            for (int j = 0; j < n; j++)  
                isvisited[i][j] = false;  
        Count = 0;  
        moveQueens(0,0);  
    }  
    return 0;  
}  </pre> 


 本文由用戶 ngmm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!