- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言题_2n皇后问题36
2n皇后问题
试题来自:程设09秋(徐)(程序设计基础课(清华大学 徐明星老师、吴文虎老师)2009秋)
【问题描述】
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
【输入格式】
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
【输出格式】
输出一个整数,表示总共有多少种放法。
【样例输入1】
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
【样例输出1】
2
【样例输入2】
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
【样例输出2】
0
分析:
每行的Q的位置,保存在一个数组中Q[6],Q[1]表示第一行q的列数。
从第一行开始1到(n+1)/2遍历
Q Q Q 接下去的每行每列遍历,并检测是否符合,
Q Q 如果Q[1]=1,那么Q[2]==Q[1],则不符合
Q Q 如果Q[1]Q[2],检测Q[2]是否在Q[1]的135度线上, Q[1]+([2]-[1])?=Q[2],Q1与Q2的行差加上Q1的列值是否等于Q2的列值
Q Q 如果Q[1]Q[2],检测Q[2]是否在Q[1]的45度线上, Q[1]-([2]-[1])?=Q[2],Q1的列值减去Q1与Q2的行差是否等于Q2的列值
如果只要求一种颜色的N皇后问题,并且没有0,1的限制,实现代码:
#includestdio.h
char NN[9][9]; //棋盘,初始设为‘-’,1表示在棋盘格为空,Q表示放置皇后
int q[6]; //记录1-N行Q的列数,q[1]=3表示第一行的Q在第三列
int Cheak(int line) //检测要添加的Q是否符合要求
{
int i;
for(i=1;iline;i++)
{
if(q[i]-q[line]==0)
return 0;
else if(q[i]-q[line]0)
{
if(q[i]-(line-i)==q[line])
return 0;
}
else
{
if(q[i]+(line-i)==q[line])
return 0;
}
}
return 1;
}
void Search(int line,int N)
{
int i,j,n;
if(line==N) //如果最后一行的Q已经存在,则打印棋盘
for(i=1;i9;i++)
{
for(j=1;j9;j++)
printf(%c,NN[i][j]);
printf(\n);
}
else //遍历此行,并通过检测查询下一行
{
line++;
for(i=1;i=N;i++)
{
NN[line][i]=Q;
q[line]=i;
if(n=Cheak(line)0)
{
Search(line,N);
}
NN[line][i]=1;
}
}
}
void Begin(int N)
{
int i;
for(i=1;i=(N+1)/2;i++)
{
q[1]=i;
NN[1][i]=Q;
Search(1,N);
NN[1][i]=1;
}
}
void main()
{
//初始
int N,i,j;
for(i=1;i9;i++)
for(j=1;j9;j++)
NN[i][j]=-;
printf(Start:(8*8)\n);
for(i=1;i9;i++)
{
for(j=1;j9;j++)
printf(%c,NN[i][j]);
printf(\n);
}
//输入N
scanf(%d,N);
for(i=1;i=N;i++)
for(j=1;j=N;j++)
NN[i][j]=1;
printf(Now you choice N=%d:(%d*%d)\n,N,N,N);
for(i=1;i9;i++)
{
for(j=1;j9;j++)
printf(%c,
您可能关注的文档
- B737系列马桶盖保持直立位的调节 (PPTminimizer)34.ppt
- BAN 逻辑(全)36.doc
- bar code条形码的概念45.doc
- BARBEN ORP及pH校准维护手册44.pdf
- BB2:东莞市出口企业出口业务管理要求6.doc
- BA思想品德+第三单元我们的朋友遍天下30.doc
- bb护国家主权的斗争+检测试题(含解析)24.doc
- bc8蓝牙模组规格书33.pdf
- BDCOM 1710路由器硬件安装手册46.pdf
- BDO 化学品安全技术说明书(定稿)43.doc
- 体育赛事赞助与品牌跨界营销创新案例分析:2025年研究报告.docx
- 线路防护制度防护现场维修作业时为确保人身安全和铁路行车安全.pptx
- 文化创意产业园区创意设计产业集聚效应研究报告.docx
- 体育赛事赞助市场2025年品牌赞助效果评估与优化策略报告.docx
- 生态保护修复项目资金申请政策实施效果报告.docx
- 体育赛事赞助品牌赞助商权益评估与品牌市场竞争力分析报告2025.docx
- 体育赛事赞助品牌效应研究:2025年市场竞争力提升策略.docx
- 2025年智能仓储物流系统智能仓储行业应用鉴定报告.docx
- 体育赛事赞助市场分析及2025年品牌推广策略洞察报告.docx
- 体育赛事赞助与品牌推广策略报告:体育赞助市场分析及品牌合作模式创新.docx
文档评论(0)