NVE演算法
① SDN與NFV
VNF Descriptor (VNFD): 屬於TOSCA標準的YMAL格式配置模板,主要描述了實例化一個VNF所需要的資源信息以及操作行為,主要用於VNF實例化以及生命周期管理。
NFV即Network Functions Virtualization(網路功能虛擬化),就是將傳統的CT業務部署到雲平台上(雲平台是指將物理硬體虛擬化所形成的虛擬機平台,能夠承載CT和IT應用),從而實現軟硬體解耦合。
NFV的本質: 絡設備的IT化和雲化
在NFV架構下,以下哪些是IMS切新平台及虛擬化的價值? abc
A 推動TTM大幅下降(Time To Market)
B 降低CAPEX/OPEX
C 提升網路靈活性和開放性
D 增加IMS系統新特性XXXXXXXXX
cordless telephone CT
VXLAN隧道支持跨數據中心建立
SDN雲數據中心場景使用VXLAN作為轉發隧道,對於BUM報文設備不會向所有的VXLAN隧道泛洪。
VXLAN集中式網關不適合大型的數據中心。
VXLAN隧道支持跨數據中心建立
在SDN雲數據中心場景中,AC控制器通過什麼協議向underlay網路中的設備下發配置? Netconf
在SDN雲網一體化場景中,AC控制器通過什麼協議和OpenStack的Neutron實現對接? Restful
BUM(Broadcast 廣播,unknown unicast, multicast)報文
01 SDN概述與發展趨勢
8.SDN網路與傳統IP網路的區別?
SDN利用控制轉發相互分離從架構上解決根本問題:讓網路敏捷起來,更快的部署新業務與快速定位故障點。採用資源集中和統一調度、能力開放的策略;讓軟體來干硬體的活;
02 DCI: Data Center interconnect, 用於數據中心的互聯網路
1什麼是DCI?
未來超過80%的業務將部署在雲上 我們雲數據中心需要基於用戶體驗進行層次化布局,而網路則需要以數據中心為中心組網進行重構,在這樣的大背景下,DCI網路孕育而生。
DCI:Data center interconnect 指的是用於數據中心之間互聯的網路,實現以數據中心為中心組網的基礎承載網。
2為什麼需要新建DCI網路?
高擴展性、低成本 資源豐富 溫度適宜等條件使得雲數據中心建設位置要求
某運營商新建大型雲數據中心與傳統骨幹網位置不重合
雲業務對網路要求
1雲計算對時延有非常嚴格的要求,如跨DC同步計算、虛擬機熱遷移等業務要求都在10ms以下
2 DC間流量具有突發性和不均衡性,需採用SDN計數進行實時智能調控,而現有網路復雜。新技術難部署。
------很難重用現有骨幹網,需要新建DCI網路。
3給予SDN的DCI方案總覽
頂層端到端協同,實現包含DC雲與DC承載網的雲網資源的一站式提供和端到端業務自動化協同發放。總的來說在多地區 多運營商部署多個數據中心的方式 目前已經成為了互聯網行業普遍認可的最有效的解決用戶覆蓋提高用戶業務體驗的方案,建設並運營一張安全可靠、可靈活調度的多數據中心互聯網路(DCI網路),也成為了各大互聯網公司在基礎架構方面的工作之重,DCI建成後 可以為寬頻 4/3G用戶提供更好的訪問體驗外另一方面可以為互聯網公司政府企業客戶的雲提供給更好的承載服務。
現在DCI面臨的實際問題:網路不靈活難以跟住業務快速迭代的步伐、鏈路利用率較低 以及居高不下的OPEX壓力等。華為SDN DCI 整體解決方案可以支撐雲數據中心業務的端到端的運營,整體架構包括承載層和控制層,需要在網路基礎承載層上引入部署SDN的控制層,
控制層是網路的業務發放管理平台和網路智能控制中心,該層主要功能部件為:
業務發放平台:提供業務自動化入口實現租戶業務自助發放以及網路資源狀態的可視個運維管理入口
業務協同平台:DCI業務需求分解和DC和IDC的協同實現端到端的跨控制器資源的協同分解
雲平台:接受業務發放平台的業務分解,進行DC運業務分解和協同,實現DC的內存儲 計算和網路的協同
DC控制器:接受OpenStack業務分解同一控制DC的NVE和VxLAN GW 實現DC內網路自動部署和控制
DCI控制器:接受業務協同平台資源的分解,實現Underlay網路部署的自動化和網路流量的智能優化
流量採集工具、調優策略的輸入、流量採集組件可以基於埠TE隧道進行流量採集和分析並提供網路流量可視化界面
DCI骨幹網解決方案承載層是租戶業務的承載實體負責跨DC網路的連接以及業務寬頻和SLA保證,骨幹網支持VxLAN技術提供了大二層組網的能力,能夠跨越廣域網和多個物理DC構建Vdc網路,實現跨區域的資源節點的互備和虛機動態遷移,有效提升了DC雲資源的利用效率,骨幹網部署業界廣泛使用的MPLS TE流量工程技術為租戶業務提供端到端的寬頻保證,提升了網路資源的利用效率,特別是提供了基於租戶和業務的差異化的服務能力,網路承載支持採用Overlay技術,Overlay業務網路基於雲業務驅動支持快速的業務開通 Underlay物理網路按需提供網路資源,實現端到端的SLA保障和智能流量的優化,目前IP Core網路中存在如下一些流量調整需求:實現IGW出口、DC出口的流量均衡 降低不同ISP網間費用的結算 提升VIP用戶體驗 針對這些需求 當前主要依賴於手工調整BGP路由策略 :
1監控鏈路帶寬利用率
2識別出需要調整的流
3基於流製作BGP策略下發給設別
4循環操作,直到流量符合期望目標的要求
4 智能流量調優方案:RR+方案
手工方法不能實時調整,耗時長、配置和維護復雜問題,RR+方案用於解決這問題。
RR+方案在IP core現網中加入SDN Controller,實現集中控制,智能化調優
RR+可以帶來什麼?
1最大化IGW帶寬利用率均衡鏈路間流量的分布,降低網間結算費用,不同客戶提供不同SLA服務
2自動調整流量,取代復雜的手工操作
3基於標准BGP通訊,可以和現網設備平滑兼容。
5什麼時PCE+方案 Path Computation Element
路由轉發用最短路徑演算法不考慮帶寬,存在利用率低的問題 PCE+為了解決這一問題
PCE+通過在網路中部署PCE server(就是SDN Controller),使用StatefulPCE技術,為 MPLS TE LSP集中算路。
使網路帶寬資源使用盡量達..到最優。該架構方案中需要新部署的網元是PCE Server,轉發設備為 PCE Client。PCE Client需要計算LSP時會向PCE Server發出計算請求,server計算後結果反饋給client,client然後進行LSP隧道建立。
思考:什麼是DCI?
DCI即Data center interconnect 指的是用於數據中心之間互聯的網路 DCI網路正是實現「以數據為中心的中心組網」的基礎承載網。
03 文檔 SDN網路解決方案
NFV (Network Function Virtulization)採用虛擬化技術,將傳統電信設備的軟體和硬體解耦,基於通用計算、存儲、網路設備實現電信網路功能,提升管理和維護效率,增強系統靈活性
SDN關鍵特徵:集中控制、優化全局效率;開放介面、加快業務上線;網路抽象,屏蔽底層差異
NFV關鍵特徵:上層業務雲化, 底層硬體標准化,分層運營,加快業務上線與創新
nfv —> 4-7層
sdn —> 1-3層 物理、數據、網路
SDN主要技術流派:ONF (Open networking foundation), IETF, 大T
PCEP(Path Computation Element Protocol)協議
ONOS --> Open-Source SDN Stack --> ONF
OpenDaylight --> IETF --> Cisco, 基於XML Schema實現SDN
華為是NFV擔任職位、貢獻文稿最多的Vendor
RAN:無線接入網(Radio Access Network)
可以利用華為私有MSCP(類似OPENFLOW)進行南向設備的控制
基於MBH虛擬接入解決方案,簡化運維
01NFV技術概述與發展趨勢
1CT當前面臨的結構性挑戰
增收方面:用戶飽和,傳統業務下滑
節流方面:CT投入成本下降,IT部分的投入從2002年6%增加到2013年13%,
創新方面:CT界一年5個創新 IT界32000倍
商用速度:CT每個月6個上市 IT每小時12個
什麼是NFV?
NFV (Network Function Virtualization) 網路功能虛擬化,ETSI組織下組建的。
希望通過採用通用伺服器 交換機和存儲設備實現傳統電信網路的功能。通過IT的虛擬化技術,許多類型的網路設備可以合並到工業界標准中,servers switchs storages 需要用軟體實現網路功能並能在一系列工業標准伺服器硬體上運行,可以根據需要遷移,實例化部署在網路的不同位置而不需要部署新設備,需要大容量Server存儲和大容量乙太網 不同應用以軟體形式遠程自動部署在統一的基礎設施上。
三個關鍵點:軟硬體解耦 開放 自動化
2NFV將IP基因融入電信網路
傳統電信網軟硬體綁定,更新困難,管理維護困難。採用虛擬化技術和雲計算的網路,硬體採用標準的伺服器 存儲設備和交換機,虛擬化之後 上層業務通過軟體形式運行在統一的標準的硬體基礎之上 。
虛擬化後的網路好處:易於更新、硬體通用化支持異構,資源歸一 簡化管理與運維
3NFV正走向成熟
2015~2016年穩步爬升 趨於成熟
1.NNFV生態系統:
ETSI在2012年成立了 NFV ISG來研究網路功能虛擬化
隨後,涌現了一批NFV的開源組織,比如OPNFV,OpenStack
NFV產業聯盟,秉承開發、創新、協同、落地的宗旨,集多長家和合作夥伴進行聯合創新,成為開放聯盟的引領者。
2.NFV框架
NFV框架主要包括3大組件:NFVI、VNF、和MANO解釋:
框架中最底層的是硬體,包括計算、存儲、和網路資源
往上的雲操作系統,完成虛擬化和雲化的相關的功能,硬體和雲操作系統成為NFVI。
I指的是instruction,設施的意思,這些設都是有VIM來管理。
在往上是虛擬網路功能,比如vIMS提供IMS的語音業務,vEPC提供4G的數據網路功能。
虛擬網路功能由VNFM來管理,提供VNF的聲明周期管理。
在往上是網路管理層及網管,網管我們可以配套NFVO進行網路業務生命周期的管理
3.NFV三大組件的關鍵要求
【1】組件MANO:包括NFVO(網路業務生命周期管理)、VNFM和VIM,
要求VNFM適配不同廠商NFVO和VIM;並且MANO系統(NFVO+VNFM+VIM)應該盡量減少對現有的OSS/BSS的沖擊。比如要求MANO支持和現有傳統平台(如U2000)的對接
【2】組件VNF(虛擬化網路功能):要求它可以運行在不同廠商的NFVI;
對應傳統的電信業務網路,每個物理網元映射為一個虛擬網元VNF。
【3】組件NFVI-雲操作系統要求優選基於OpenStack的雲操作系統
將物理計算/存儲/交換網路資源通過虛擬化計算轉換為虛擬的計算/存儲/交換網路資源
【4】組件NFVI-硬體
要求它優選具有虛擬化輔助功能的晶元的COTS
同時具備高IOPS與高可靠性的磁陣
低RAID等級的磁陣建議冗餘組網
03 FV關鍵能力
4.高可靠性
應用層、雲操作系統層、硬體層都有相應的冗餘機制。
應用層高可靠性可以通過主備和負荷分擔方式實現主備VM之間的冗餘。確保應用層會話0中斷,99.999%的可用性。
雲操作系統的可靠性可以通過虛擬機快速重建冗餘機制來實現。
硬體層高可靠性主要通過族化以及物料冗餘機制來實現計算、存儲、網路等硬體設備的冗餘
硬體層、VM層、業務層各層可靠性各自獨立,高度互補確保整體可用性。
5.高性能
NFV業界最權威的評估公司SPECvirt。華為的FusionSphere性能得分為4.6,排第一。
呼叫處理方面華為的FusionSphere比第二名的Vmware高17%。
高性能技術的關鍵技術:NUMA親和性、CPU綁定、DPDK、透明巨頁、虛擬中斷優化等
6.NFV存在的問題
(1)標准不成熟,技術架構實現上有分歧;
(2)多供應商、集成復雜。
(3)部件兼容性風險大。
(4)NFV工程難度大。
(5)網路功能虛擬化技術滯後
(6)虛擬化可靠性不足。傳統電信要求99.999%可靠性
② 誰可以幫我完整的解釋下這個程序~這個程序是數據結構八皇後的演算法
有人有265g多開器的源碼嗎
③ 求此八皇後C程序的流程圖~~急~~要流程圖~~
八皇後問題:
問題提出:
8×8的棋盤上放置8個皇後,在同一橫線、豎線、對角線上會產生沖突,
求不產生沖突即8個皇後都安全的放置方法。
這里改變NCOUNT即可以求出n皇後的n×n棋盤的放置方法
張可彥:
[email protected]
*/
#include
"stdio.h"
#define
NCOUNT
8
int
nArray[NCOUNT][NCOUNT];
//
判斷一個點是否是安全點
bool
IsSafe(int
i,int
j)
{
int
x=i,y=j;
while(1)
{
x
-=
1;
if(
x<0
)break;
y
-=
1;
if(
y<0)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
x
+=
1;
if(
x>NCOUNT-1
)break;
y
+=
1;
if(
y
>NCOUNT-1
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
x
-=1;
if(
x<0
)break;
y
+=1;
if(
y>NCOUNT-1
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
x
+=1;
if(
x>NCOUNT-1
)break;
y-=1;
if(
y<0
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
x
-=1;
if(
x<0
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
x
+=1;
if(
x>NCOUNT-1
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
y
-=1;
if(
y<0
)break;
if(
nArray[x][y]
==
1)return
false;
}
x=i;
y=j;
while(1)
{
y
+=1;
if(
y>NCOUNT-1
)break;
if(
nArray[x][y]
==
1)return
false;
}
return
true;
}
void
main()
{
int
nVe=-1,nHo=0;
bool
bRetry
=
false;
int
nSol
=
0;
//
清除棋盤
for(int
i=0;i<NCOUNT;i++)
{
for(
int
j=0;j<NCOUNT;j++)
nArray[i][j]
=
0;
}
while(1)
{
nVe
+=
1;
if(
nVe>NCOUNT-1)
{//
棋盤放滿,列印當前棋盤上棋子位置
nSol++;
printf("Sol
%d:
",nSol);
for(int
i=0;i<NCOUNT;i++)
{
for(
int
j=0;j<NCOUNT;j++)
if(
nArray[i][j]==1)
printf("(%d,%d)
",i,j);
}
printf("\r\n");
//
回溯查找下一個可行方案
nVe
-=
2;
bRetry
=
true;
continue;
}
int
nFill
=
0;
if(
bRetry
)
{
//
回溯計算
bRetry
=
false;
for(
i=0;i<NCOUNT;i++)
{//
得到棋子的位置
if(
nArray[nVe][i]
==
1)
{
nArray[nVe][i]
=
0;
nFill
=
i;
break;
}
}
if(
nFill
==
NCOUNT-1)
{//
棋子在當前行已經是最後的位置
//
如果是第一行,演算法結束
if(
nVe
==
0)return;
//
否則回溯
nVe
-=
2;
bRetry
=
true;
continue;
}
//
從當前位置之後查找一個安全點
nFill
+=
1;
}
bool
bFilled
=
false;
for(
i=nFill;i<NCOUNT;i++)
{//
當前行查找一個安全點
if(
IsSafe(nVe,i))
{
bFilled
=
true;
nArray[nVe][i]
=
1;
break;
}
}
//
找不到安全點,回溯
if(
!bFilled
)
{
nVe
-=
2;
bRetry
=
true;
}
}
}
④ 哪位高手幫我用c語言設計一個「八皇後問題「的程序並給出程序設計的流程圖 謝謝啊
八皇後問題:
問題提出: 8×8的棋盤上放置8個皇後,在同一橫線、豎線、對角線上會產生沖突,
求不產生沖突即8個皇後都安全的放置方法。
這里改變NCOUNT即可以求出n皇後的n×n棋盤的放置方法
張可彥: [email protected]
*/
#include "stdio.h"
#define NCOUNT 8
int nArray[NCOUNT][NCOUNT];
// 判斷一個點是否是安全點
bool IsSafe(int i,int j)
{
int x=i,y=j;
while(1)
{
x -= 1;
if( x<0 )break;
y -= 1;
if( y<0)break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x += 1;
if( x>NCOUNT-1 )break;
y += 1;
if( y >NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
y-=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y -=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
return true;
}
void main()
{
int nVe=-1,nHo=0;
bool bRetry = false;
int nSol = 0;
// 清除棋盤
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
nArray[i][j] = 0;
}
while(1)
{
nVe += 1;
if( nVe>NCOUNT-1)
{// 棋盤放滿,列印當前棋盤上棋子位置
nSol++;
printf("Sol %d: ",nSol);
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
if( nArray[i][j]==1)
printf("(%d,%d) ",i,j);
}
printf("\r\n");
// 回溯查找下一個可行方案
nVe -= 2;
bRetry = true;
continue;
}
int nFill = 0;
if( bRetry )
{ // 回溯計算
bRetry = false;
for( i=0;i<NCOUNT;i++)
{// 得到棋子的位置
if( nArray[nVe][i] == 1)
{
nArray[nVe][i] = 0;
nFill = i;
break;
}
}
if( nFill == NCOUNT-1)
{// 棋子在當前行已經是最後的位置
// 如果是第一行,演算法結束
if( nVe == 0)return;
// 否則回溯
nVe -= 2;
bRetry = true;
continue;
}
// 從當前位置之後查找一個安全點
nFill += 1;
}
bool bFilled = false;
for( i=nFill;i<NCOUNT;i++)
{// 當前行查找一個安全點
if( IsSafe(nVe,i))
{
bFilled = true;
nArray[nVe][i] = 1;
break;
}
}
// 找不到安全點,回溯
if( !bFilled )
{
nVe -= 2;
bRetry = true;
}
}
}
⑤ 求解碼!!!
你腦殘。
⑥ 分子動力學計算的可靠性和系綜說明小結
一、 計算的可靠性
計算是否可靠?要考慮三個方面。
演算法方面 。為了實現分子動力學的模擬,採用了數值計算方法,在長時間的計算後必然會有誤差的累積,所以演算法如果不能滿足兩個條件就會導致體系總能量出現明顯漂移(drifts)。即演算法需要滿足:
(1)time-reversibilitysymmetry;
(2)symplecticproperty。
計算精度。 除了演算法,對於體系的能量和力的計算精度是否足夠精確和充分,也是對計算可靠性有重要影響的。
體系的初始化設置 。體系初始化良好,可以減少數據冗餘以及有利於得到可靠結果。主要有五點:
(1)體系原子數目。選擇的原子數應當盡量反映真實體系的特點而數目盡可能少。
(2)位置和速度初始化。原子的位置可以是隨機的,但不能與體系的約束條件有沖突,也要避免原子靠得太近。速度的初始化,可以將速度設為0,然後在一個給定的溫度下從一個麥克斯韋-玻爾茲曼分布抽樣得到速度。在體系沒有特殊的約束條件下,通過從此種分布中得到的速度不會與體系約束條件沖突。此外,在速度初始化時,一般取體系質心速度為零,以避免體系在空間中出現整體漂移。
(3)時間步長。數值積分,步長選取很重要,因為要在每一積分步中,將各個需要計算的量當作常量,才能進行代數運算,由F= - dU/dr,變化較大較快的應當作為整體考慮的依據。原子振動周期在10fs量級,一般將其分成5~10步,如有更高精度要求,可以將步長設置更短,所以時間步長一般設置在0.1fs到幾個fs之間。通常小的時間步提高了計算精度,增加了計算量,長的時間步則反之。如果總能變得不穩定(漂移或者漲落過大),這表明可能是時間步長過長導致。在高溫下,原子運動相對要快些,質量輕的,或者勢場變化很快的,一般需要設置更短的時間步長。
(4)模擬的總時間長度。一般總的模擬時間為10^3~10^6個時間步長。總的模擬時間要確保比體系的充分弛豫時間長以使數據可靠,按網上論壇的經驗,一般應當至少為體系充分弛豫時間的3倍。對於一些特殊情況,如相變,氣相沉積,晶體生長等,平衡很慢,就需要保證總的模擬時間足夠長。
(5)系綜的選擇。此問題可以參考做的領域的相關文獻,或者與實驗比較。小木蟲等論壇也有討論。
二、系綜問題
分子動力學中關鍵的概念之一為系綜(ensemble)。Ensemble—an imaginary collection of systemsdescribed by the same Hamiltonian with each system in a unique microscopicstate at any given instant in time。系綜是指在一定的宏觀條件下(約束條件),大量性質和結構完全相同的、處於各種運動狀態的、各自獨立的系統的集合。全稱為統計系綜。系綜是用統計方法描述熱力學系統的統計規律性時引入的一個基本概念;系綜是統計理論的一種表述方式,系綜理論使統計物理成為普遍的微觀統計理論 ;系綜並不是實際的物體,構成系綜的系統才是實際物體。
類似在音樂領域中,各樂器各有特點,但一起協奏之後會形成一個特別的整體效果。分子動力學中的原子行為不盡相同,但在適當的模擬和平衡後,也會有一個整體的效果而具有相同的熱力學性質。
常用系綜有微正則系綜,正則系綜,巨正則系綜,等溫等壓系綜等,微正則系綜為最簡單和最基礎的一種,其他系綜的研究過程可參照得到。在熱力學極限下,各系綜是等價的,但是在實際的模擬中,大多數情況是遠遠達不到熱力學極限的,因此能量的漲落(fluctuations)不能消失,有時候根據實際情況選擇系綜是有必要的。
從理論上來講,使用NVE系綜對於體系的計算肯定是最為理想的。但是使用NVE系綜,體系的溫度取決於初始條件,導致溫度不可控,直接使用NVE系綜則溫度難以達到預期。可以先使用NVT系綜控溫,進行體系的預平衡,然後再用NVT系綜平衡下的狀態作為NVE系綜的初始條件,進行計算。這樣在NVE系綜下跑,體系的溫度就能在一個可以接受的情況下波動。
2018-06-14
⑦ c語言題目
(1)遞歸演算法
#define QUEENS 8
int iCount = 0;
int Site[QUEENS];
void Queen(int n);
void Output();
int IsValid(int n);
/*----------------------------Main:主函數。--------------------*/
void main()
{
Queen(0);
getch();
}
/*-----------Queen:遞歸放置第n個皇後,程序的核心!-------------*/
void Queen(int n)
{
int i;
if(n == QUEENS)
{
Output();
return;
}
for(i = 1 ; i <= QUEENS ; i++)
{
Site[n] = i;
if(IsValid(n))
Queen(n+1);
}
}
/*--IsValid:判斷第n個皇後放上去之後,是否合法,即是否無沖突。---*/
int IsValid(int n)
{
int i;
for(i = 0 ; i < n ; i++)
{
if(Site[i] == Site[n])
return 0;
if(abs(Site[i] - Site[n]) == (n - i))
return 0;
}
return 1;
}
/*------Output:輸出一個解,即一種沒有沖突的放置方案。---------*/
void Output()
{
int i;
printf( "No.%-5d " , iCount);
for(i = 0 ; i < QUEENS ; i++ )
printf( "%d " , Site[i]);
printf( "\n ");
}
/*---------非遞歸演算法----------------*/
#include <stdio.h>
#define NCOUNT 8
int nArray[NCOUNT][NCOUNT];
// 判斷一個點是否是安全點
bool IsSafe(int i,int j)
{
int x=i,y=j;
while(1)
{
x -= 1;
if( x<0 )break;
y -= 1;
if( y<0)break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x += 1;
if( x>NCOUNT-1 )break;
y += 1;
if( y >NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
y-=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y -=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
return true;
}
void main()
{
int nVe=-1,nHo=0;
bool bRetry = false;
int nSol = 0;
// 清除棋盤
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
nArray[i][j] = 0;
}
while(1)
{
nVe += 1;
if( nVe>NCOUNT-1)
{// 棋盤放滿,列印當前棋盤上棋子位置
nSol++;
printf("Sol %d: ",nSol);
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
if( nArray[i][j]==1)
printf("(%d,%d) ",i,j);
}
printf("\r\n");
// 回溯查找下一個可行方案
nVe -= 2;
bRetry = true;
continue;
}
int nFill = 0;
if( bRetry )
{ // 回溯計算
bRetry = false;
for( i=0;i<NCOUNT;i++)
{// 得到棋子的位置
if( nArray[nVe][i] == 1)
{
nArray[nVe][i] = 0;
nFill = i;
break;
}
}
if( nFill == NCOUNT-1)
{// 棋子在當前行已經是最後的位置
// 如果是第一行,演算法結束
if( nVe == 0)
{
getchar();
return;
}
// 否則回溯
nVe -= 2;
bRetry = true;
continue;
}
// 從當前位置之後查找一個安全點
nFill += 1;
}
bool bFilled = false;
for( i=nFill;i<NCOUNT;i++)
{// 當前行查找一個安全點
if( IsSafe(nVe,i))
{
bFilled = true;
nArray[nVe][i] = 1;
break;
}
}
// 找不到安全點,回溯
if( !bFilled )
{
nVe -= 2;
bRetry = true;
}
}
}
(2)
#include <stdio.h>
main()
{
int h,z,s,o;
FILE *fp;
char ch,filename[20];
printf("輸入要統計的文章名稱:\n");
scanf("%s",filename);
if((fp=open(filename,"r"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
ch=fgetc(fp);
h=0;z=0;s=0;o=0;
while(ch!=EOF)
{
if(ch>'0x7f')
h++;
else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='z'))
z++;
else if(ch>='0'&&ch<='9')
s++;
else
o++;
ch=fgetc(fp);
}
fclose(fp);
h=h/2;
printf("這篇文章里有 %d 個漢字,%d 個英文字母,%d 個數字和%d 個其他字元\n",h,z,s,o);
}