当前位置: 代码迷 >> 综合 >> poj-1321-棋盘问题-回溯
  详细解决方案

poj-1321-棋盘问题-回溯

热度:91   发布时间:2023-12-19 11:27:10.0
题意:

给你一个棋盘,#的地方可以放棋。*的地方不能放棋。让你把k个棋子放入这个棋盘上,

要求两个棋子之间不可以同行或者同列。

做法:

和八皇后的问题很像。不可以同行,那么每一行至多有一个棋子。

可以对棋子的方法进行回溯。从第一行往下放,放下一个棋子之后,

把棋子所在的列标记一下,然后接着在下一行放棋子。直至棋子放完。

注意:
主要注意一下回溯函数的结束标志。

#include<iostream>
#include<stdio.h>
#include<string.h>
#define mem(map) memset(map,0,sizeof(map))
using namespace std;
int count;
int n,k;
int map[9][9];
int leny[9];
void dfs(int x,int y,int z)
{int i,j;if(z==k){count++;return ;}for(i=x+1;i<=n;i++){for(j=1;j<=n;j++){if(map[i][j]==1&&leny[j]==0){leny[j]=1;dfs(i,j,z+1);leny[j]=0;}}}
}
int main()
{int i,j;char str;while(scanf("%d%d%*c",&n,&k)&&(n+1||k+1)){mem(map);mem(leny);for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%c",&str);if(str=='#')map[i][j]=1;}getchar();}count=0;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(map[i][j]==1){leny[j]=1;dfs(i,j,1);leny[j]=0;}}}printf("%d\n",count);}return 0;
}