A - 棋盘问题 POJ - 1321

两个棋子不能放在棋盘中的同一行或者同一列
两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
当为-1 -1时表示输入结束。 
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域

Sample Input
2 1
#.
.#
4 2
...#
..#.
.#..
#...
-1 -1
Sample Output
2

1

1.棋子第一行进行遍历,j=0

标记第一行,当前摆放棋子数目way==1,

1.2.棋子第二行进行遍历,j=1

标记第二行,当前摆放棋子数目way==2,

way==K,return

清除第二行标记,摆放棋子数目way--,way=1

1.3棋盘第三行开始遍历,j=2

标记第三行,当前摆放棋子数目way==2

way==K,return

清除第三行标记,摆放棋子数目way--,way=1

1.4 标记第四行,当前摆放棋子数目way==2

way==K,return

清除第四行标记,摆放棋子数目way--,way=1

1系列完全遍历,第一行进行清除标记,way--,way==0

---每次遍历完全后,最后一行的DFS来开启下一行的遍历

由最后一行DFS进入2.系列--类似以上过程


******

清除标记与dfs(K+1)是点睛之笔

#include
#include
using namespace std;
char map[9][9];
int visited[9];
int N,K;//棋盘规格  棋子数目 
int way;//当前步数 
int count; //最终结果 
void dfs(int k)  
{  
    if(way==K)  //棋子个数达到要求,方案数+1,返回  
    {  
    	//cout<<"棋子个数达到要求,方案数+1,返回  "<=N)//若搜出棋盘外,返回  
        return ;  
    for(int j=0;j>N>>K)
	{
		if(N==-1&&K==-1)
			break;
		memset(map,0,sizeof(map));
		memset(visited,0,sizeof(visited));
		for(i=0;i>map[i]; 
		}
		count=way=0;
		dfs(0);
		cout<


你可能感兴趣的:(算法入门,DFS/BFS,基础DFS)