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);
}