问题链接:。
问题简述:参见上述链接。
问题分析:二维数组里,只有放置"#"的地方才算是棋盘,可以放置棋子。"#"表示棋盘区域,"."表示空白区域。
对于n*n的区域,只放置k个棋子,并且k<=n。而且各个棋子不能放在同一行和同一列里。
虽然说这个题有点像八皇后问题,但是还是有所不同的。问题用DFS方法来解决。
程序说明:程序中,对于访问过的列,使用数组visit[]来记录,visit[i]=1表示第i列已经有棋子,visit[i]=0表示第i列还没有棋子。
这个问题的关键是k<n的情形,需要正确处理。当k<n,那么第一个棋子就可以放在第0行到第n-k行;在DFS过程中,第i个棋子可以按行顺序放,也可以跳过一行到n-k行。调用函数dfs()前的循环控制就是考虑这种情形。
AC通过的C语言程序如下:
/* POJ1321 棋盘问题 */#include#include #define MAXN 8char grid[MAXN][MAXN];int visit[MAXN];int maxplan;int n, k, count;// DFS:试探row行,col列void dfs(int row){ int i, j; if(row >= n) return; for(i=0; i