广搜----poj1321棋盘问题
棋盘问题 poj1321;
八皇后问题 小白书P123
棋盘问题对着答案已经看了两天,还是哏不懂dfs是为什么那样子写,看到博客上说和八皇后问题很像,就去看了看小白书上的八皇后问题;
八皇后问题简要:在一个8*8的棋盘上放置八个皇后,使得她们不能互相攻击;每个皇后都会攻击她们同行同列同对角线的其他皇后,所以请找出有多少方案放置皇后;
这个问题是八个皇后要在一个八行八列的棋盘上按着规则放置,引申一下:但是如果说要让七个皇后在8*8的棋盘上按照相同规则放置将会有多少方案nie ~( ̄▽ ̄)~* ?
那么这就与棋盘问题更相似了;
我们先考虑八皇后问题:
代码:
void searc(int cur)
{
int i,j;
if(cur==k) tot++;
else
for(i=0;i<n;i++)
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
//列,主对角线,副对角线,详见P125图
{
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
searc(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
}
当然这个代码只能解决的是基本八皇后问题;
接下来我们来考虑棋盘问题,如下所示:
/*
5 4
....#
...#.
..#..
.#...
#....
*/
Given 这样一个棋盘,求满足方案数;
void dfs(int cur)
{
if(m==k)
{ tot++; return; }
if(cur>=n) return ;
for(int i=0;i<n;i++)
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
{
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
m++;
dfs(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; //一定要写上回溯的时候会运行这两步;
m--;
}
}
dfs(cur+1);
}
这个是在模拟八皇后问题的程序的时候明白了一点,但是具体的回溯过程还是云里雾里的,需要找大神问问。