華為OJ之N皇后問題(C++程式碼)
1問題描述
N皇后問題,就是如何將國際象棋中的N個皇后放在N*N的棋盤上而不會互相攻擊,是一種通過列舉,再遞迴、回溯的思想。
2思路
以8皇后問題為例,可知在8*8二維陣列中,每個點用data[i][j]表示(0 <= i,j <= 7)。
其中其主對角線上(左上到右下)的每個點的i-j+7的值都相同(範圍0-14)。
其從對角線上(右上到左下)的每個點i+j的值都相同(返回0-14)。
且其中每個子方陣的主對角線之間的i-j+7的值都不同,從對角線之間的i+j的值也不同。
如在4*4的子方陣中的data[3][4]:
穿過data[3][4]的主對角線:3-4+7=6
穿過data[3][4]的從對角線:3+4=7
若是穿過data[4][4],其主對角線:4-4+7=7;從對角線:4+4=8
為何要研究這種規律呢?
因為擺放皇后時,可知N個皇后肯定在不同行,不同列,以及不同對角線上。因此每在一個不同行擺放一個皇后時,首先要檢查該列是不是被佔用,以及穿過該點的主、從對角線是否被佔用,若是則要換列。
3具體程式碼
bool checkCol[]:表示每一列的佔用情況,大小1*N
bool leftCross[]:表示穿過該放置點(i,j)的主對角線的佔用情況,其下標為i-j+7。
bool rightCross[]:表示穿過該放置點(i,j)的從對角線的佔用情況,下標為i+j。
int * *data:N*N棋盤。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int count_Method = 0;
int queenNum = 0;
bool *checkCol;
bool *leftCross;
bool *rightCross;
int **data;
void getNQueens( int );
/*
功能: 求解放置8皇后方案的個數。
輸入:N個皇后個數
無
返回:
int:放置8皇后方案的個數
*/
int PlaceQueenMethodNum(int N)
{
/*在這裡實現功能*/
queenNum = N;
data = (int **)malloc(N*sizeof(int*));
for(int i = 0; i < N; i++){
data[i] = (int *)malloc(N*sizeof(int));
}
checkCol = (bool *)malloc(N*sizeof(bool)); //column(列)佔用情況,佔用為true,反之false
leftCross = (bool *)malloc((2*N-1)*sizeof(bool));//左對角線
rightCross = (bool *)malloc((2*N-1)*sizeof(bool));//右對角線情況
for(int i = 0; i < 2*N-1; i++ ) //主、從對角線
leftCross[i] = rightCross[i] = false; //表示安全
for(int i = 0; i < N; i++ )//chess
{
checkCol[i] = false;
for(int j = 0; j < N; j++ ){
data[i][j] = 0;
}
}
getNQueens( 0 );
return count_Method;
}
void getNQueens( int row )
{
if( row == queenNum )//N個皇后安置就位,解決方案+1
{
count_Method++;
return;
}
for( int column = 0; column < queenNum; column++ )
{
if( !checkCol[column] && leftCross[row-column+7] == false && rightCross[row+column] == false )
{
data[row][column] = 1;
//安置皇后
checkCol[column] = true; //此列被佔
leftCross[row-column+7] = true; //主對角線被佔
rightCross[row+column] = true; //從對角線被佔
getNQueens(row+1); //下一個皇后
//此步重置,列右移繼續找
data[row][column] = 0;
checkCol[column] = false;
leftCross[row-column+7] = false;
rightCross[row+column] = false;
}
}
}
int main(){
int n;
cin>>n;
cout<<PlaceQueenMethodNum(n);
system("pause");
}
相關推薦
華為OJ之N皇后問題(C++程式碼)
1問題描述 N皇后問題,就是如何將國際象棋中的N個皇后放在N*N的棋盤上而不會互相攻擊,是一種通過列舉,再遞迴、回溯的思想。 2思路 以8皇后問題為例,可知在8*8二維陣列中,每個點用data[i][j]表示(0 <= i,j <= 7)。
華為機試—N皇后問題(高階題160分:兩種回溯法解決 吐血整理)
一、問題描述: 在n×n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於再n×n的棋盤上放置n個皇后,任何2個皇后不妨在同一行或同一列或同一斜線上。 輸入: 給定棋盤的大小
華為IT應用開發工程師(C++應用軟體)實習生筆試+360企業安全服務端開發工程師實習生筆試
華為筆試: 三道程式設計題(120分鐘,每道題200分) 第一道:輸入兩個數,將他們反轉求和,比方(輸入123,456,輸出975) 只需要注意輸入輸出格式的問題,演算法本身不難,兩個輾轉取餘解決 第
華為OJ做題記錄(包含題目和ac程式碼)
1. 題目說明 蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。 樣例輸入 5 樣例輸出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 介面說明 原型 void GetResult(int Num, char * pResul
課程設計之四位加法計算器(2)(C程式碼)
#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; sbit led=P3
2016華為校招機試題(軟體開發)
今天華為的機試題明顯變難了,而且和往年的不一樣了,準備了前些年的題目,但是今年的做起來很不習慣。機試時可以上網,但是搜不到原題。最後的機試分數300分,只做了第一題和第二題。 如果你想去華為,早早準備,多刷刷華為的OJ (華為線上訓練與測試平臺) http://career-oj
C語言基礎之巨集定義(附程式碼)
C語言基礎之巨集定義 巨集定義:是C語言提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯。巨集定義和操作符的區別是:巨集定義是替換,不做計算,也不做表示式求解。#define預處理指令可以用來定義巨集。 巨集定義的形式,分為帶引
八皇后(c語言)
程式碼+解釋說明+心得 (按順序來的) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <std
分治法之合併排序(C實現)
#include <stdio.h> void merge(int a[],int p,int q,int r) { int n1=q-p+1,n2=r-q; int
資料結構---線性表之單鏈表(C語言)
上一篇已經寫過,線性表的儲存結構有順序儲存結構和鏈式儲存結構兩種,前者稱為順序表,後者稱為連結串列。本篇文章是對連結串列的學習。--------------------------------------------------------------------------
Android 接入華為通知欄推送教程(特此整理)
前言: 受華為開發者聯盟工作人員的邀約,特此將本篇部落格重新整理一遍,希望讓更多人受益,大家也可以參加華為開發者聯盟推出活動,去提問自己的問題或者投稿。 掃二維碼就可以參與活動哦。 首先本教程是基於華為推送 2.5.2.300 版本的 一:注意事項
華為初面+綜合面試(技術面)
華為面試整體流程大致分為筆試,性格測試,面試,綜合面試,回學校等結果。筆試來說,華為的難度較中等,選擇題難度和網易騰訊差不多。最後的程式碼題,相比下來就簡單很多,一共3道題目,前2題很容易就AC,題目已經記不太清楚,不過難度確實不大。最後一題最後提交的程式碼過了
兩個有序單鏈表歸併為一個有序單鏈表(c實現)
兩個有序單鏈表歸併為一個有序單鏈表 c程式碼: //定義節點 struct ListNode { int m_nValue; ListNode* m_pNext; } ; Lis
華為手機連線androidStudio和列印C程式碼log解決方法
相信有部分程式設計師碰到過華為手機開啟了開發者模式和打開了usb除錯模式後也連線不上androidStudio的問題 ,起初我也對這個簡單的問題折磨過一會,後來找到了原因其實很簡單 就是連上電腦後,開發者模式和usb除錯開啟後,下拉狀態列,在狀態列中有一個”正在
16點陣圖像轉換為8點陣圖像(c++,python)
如之前所說,我們需要將16點陣圖像轉換為8點陣圖像;16點陣圖像的畫素值一共有:2^16=65536種顏色;而8位點陣圖像只有:2^8=256種顏色,傳統的位數轉換都是:畫素值*256/65536,比如photoshop,以及matlab的im2uint8函式都是如此,在一般
動態規劃之揹包問題(C語言)
動態規劃 動態規劃(英語:Dynamic programming,簡稱DP)是一種通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題 動態規劃思想大致上為:若要解一個給定問題,我們需要解其不同
演算法-N皇后(遞迴)
package MOOC; /** * 輸入整數n,要求n個國際皇后,擺在n*n的棋盤上,使其互相不能攻擊(不在同一行列對角線上),輸出全部方案 */ import java.util.Scann
資料結構之單鏈表(C++實現)
很早前就想用C++來實現那些常用的資料結構。 今天就算是個開端把。還是那句話,看的再多不如自己動手寫一遍。 按照自己的思路寫。首先你得熟悉那種結構的特點,然後才能談實現。 連結串列是一種很常用的資料結構。支援在任意地方對資料進行增刪改查。 但是不支援隨機訪問。所以複雜度
演算法設計之計數排序 (C++實現)
之前的文章介紹的一些排序演算法有一個共同特點,它們都是基於比較的。這些演算法都有的一個性質就是:在排序的最終結果中,各元素的次序依賴於它們之間的比較。對包含n個元素的輸入序列來說,任何比較排序在最好情況下都要經過nlgn次比較。因此,歸併排序和堆排序是漸進最優的,任何已知的
23種設計模式之策略模式(c++實現)
定義 策略模式:定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 Strategy 模式典型的結構圖為: 大家肯定看著很懵逼,其實第一次接觸類圖的時候我自己也是這樣。 那麼咱們舉個例子來解釋一下。