zoukankan
html css js c++ java
国际象棋“皇后”问题的回溯算法
//
国际象棋“皇后”问题处理头文件
//
国际象棋“皇后”问题的回溯算法
/**/
/*
作者:成晓旭
时间:2001年10月9日(17:35:38-18:00:00)
内容:完成“皇后”问题的程序序言部分
时间:2001年10月9日(14:00:00-15:00:00)
内容:完成“皇后”问题的程序序言部分
===================================================
问题描述:
在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”,
并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横
及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及
在一条斜线上只能有一个皇后<皇后相互捕捉>)
编程思想:
算法描述:
{
输入棋盘大小值n;
m=0; //从空配置开始
notcatch=1; //空配置中皇后不能相互捕捉
do
{
if(notcatch)
{
if(m==n)
{
输出解;
调整(形成下一个候选解);
}
else
扩展当前候选解至下一列; //向前试探
}
else
调整(形成下一个候选解); //向后回溯
notcatch = 检查当前候选解的合理性
}while(m!=0)
}
*/
#include
"
stdlib.h
"
#define
MAXN 100
//
全局变量及全局工作数组定义
int
m,n,NotCatch;
int
ColFlag[MAXN
+
1
];
/**/
/*
表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)
*/
int
RowFlag[MAXN
+
1
];
/**/
/*
RowFlag[i]:表示第i行没有皇后(1:没有;0:有)
*/
int
upBiasFlag[
2
*
MAXN
+
1
];
/**/
/*
upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)
*/
int
dnBiasFlag[
2
*
MAXN
+
1
];
/**/
/*
dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)
*/
//
显示输入填写的数字
void
ArrangeQueen()
...
{
int
i;
char
answer;
printf(
"
输入棋盘边格数:
"
);
scanf(
"
%d
"
,
&
n);
for
(i
=
0
;i
<=
n;i
++
)
/**/
/*
设置程序初始状态
*/
ColFlag[i]
=
1
;
for
(i
=
0
;i
<=
2
*
n;i
++
)
upBiasFlag[i]
=
dnBiasFlag[i]
=
1
;
m
=
1
;
ColFlag[
1
]
=
1
;
NotCatch
=
1
;
ColFlag[
0
]
=
0
;
do
...
{
if
(NotCatch)
...
{
if
(m
==
n)
...
{
printf(
"
列 行
"
);
for
(i
=
1
;i
<=
n;i
++
)
/**/
/*
找到可行解,输出
*/
printf(
"
%3d %3d
"
,i,ColFlag[i]);
printf(
"
还要继续搜索吗(Q/q for Exit)?
"
);
scanf(
"
%c
"
,
&
answer);
if
(answer
==
'
Q
'
||
answer
==
'
q
'
)
exit(
0
);
while
(ColFlag[m]
==
n)
...
{
m
--
;
/**/
/*
清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志
*/
RowFlag[ColFlag[m]]
=
upBiasFlag[m
+
ColFlag[m]]
=
dnBiasFlag[n
+
m
-
ColFlag[m]]
=
1
;
}
ColFlag[m]
++
;
/**/
/*
调整第m列的皇后配置(扩展调整)
*/
}
else
...
{
/**/
/*
设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志
*/
RowFlag[ColFlag[m]]
=
upBiasFlag[m
+
ColFlag[m]]
=
dnBiasFlag[n
+
m
-
ColFlag[m]]
=
0
;
ColFlag[
++
m]
=
1
;
/**/
/*
向前试探
*/
}
}
else
...
{
while
(ColFlag[m]
==
n)
/**/
/*
向后回溯
*/
...
{
m
--
;
/**/
/*
清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志
*/
RowFlag[ColFlag[m]]
=
upBiasFlag[m
+
ColFlag[m]]
=
dnBiasFlag[n
+
m
-
ColFlag[m]]
=
1
;
}
ColFlag[m]
++
;
/**/
/*
调整第m列的皇后配置(回溯调整)
*/
}
NotCatch
=
RowFlag[ColFlag[m]]
&&
upBiasFlag[m
+
ColFlag[m]]
&&
dnBiasFlag[n
+
m
-
ColFlag[m]];
}
while
(m
!=
0
);
}
void
dArrange_Queen_All(
int
k,
int
n)
...
{
int
i,j;
char
answer;
for
(i
=
1
;i
<=
n;i
++
)
...
{
if
(RowFlag[i]
&&
upBiasFlag[k
+
i]
&&
dnBiasFlag[n
+
k
-
i])
...
{
ColFlag[k]
=
i;
RowFlag[i]
=
upBiasFlag[k
+
i]
=
dnBiasFlag[n
+
k
-
i]
=
0
;
if
(k
==
0
)
...
{
printf(
"
列 行
"
);
for
(j
=
1
;j
<=
n;j
++
)
/**/
/*
找到可行解,输出
*/
printf(
"
%3d %3d
"
,i,ColFlag[i]);
printf(
"
还要继续搜索吗(Q/q for Exit)?
"
);
scanf(
"
%c
"
,
&
answer);
if
(answer
==
'
Q
'
||
answer
==
'
q
'
)
exit(
0
);
}
else
dArrange_Queen_All(k
+
1
,n);
RowFlag[i]
=
upBiasFlag[k
+
i]
=
dnBiasFlag[n
+
k
-
i]
=
1
;
}
}
}
void
dArrangeQueenAll()
...
{
int
i;
printf(
"
输入棋盘边格数:
"
);
scanf(
"
%d
"
,
&
n);
for
(i
=
0
;i
<=
n;i
++
)
/**/
/*
设置程序初始状态
*/
ColFlag[i]
=
1
;
for
(i
=
0
;i
<=
2
*
n;i
++
)
upBiasFlag[i]
=
dnBiasFlag[i]
=
1
;
dArrange_Queen_All(
1
,n);
}
查看全文
相关阅读:
CSU1784
HDU 6128 Inverse of sum(数学)
容斥原理入门
HDU 6129 Just do it(规律)
HDU 6140 Hybrid Crystals(zz)
HDU 6143 Killer Names(排列+容斥,dp)
zzuli 2177 Contest
zzuli 2180 GJJ的日常之沉迷数学(逆元)
除法逆元入门
乘法逆元数论篇
原文地址:https://www.cnblogs.com/ljl_falcon/p/2194087.html
最新文章
day11-1 迭代器和生成器
day10-1
day9-1 装饰器2
Tornado
CentOS 6.4下PXE+Kickstart无人值守安装操作系统
WebSocket协议
IO多路复用(select、poll、epoll)介绍及select、epoll的实现
网络编程
scrapy-redis组件
flask,scrapy,django信号
热门文章
flask信号
POJ 1904
HDU 2457
HDU 6134
Aizu
Gym
HackerRank
ZOJ3435
Codeforces 990C
Gym 101510C
Copyright © 2011-2022 走看看