POJ 1321.棋盘问题

来源:互联网 发布:软件就业前景 编辑:程序博客网 时间:2024/06/02 07:29

题目:http://poj.org/problem?id=3009

AC代码(C++):

#include <iostream>#include <algorithm>#include <stdio.h>#include <vector>#include <queue>#include <math.h>#include <string>#include <string.h>#include <bitset>#define INF 0xfffffff#define MAXN 10using namespace std;int n,k;char map[MAXN][MAXN];int cnt,ans;bool isOK(int x, int y){for(int i = 0; i < n; i++){if(map[i][y]=='*')return false;}for(int i = 0; i < n; i++){if(map[x][i]=='*')return false;}return true;}void dfs(int x, int y){if(cnt==k){ans++;return;}if(y<n-1)y++;else{x++;y = 0;}int i = x;int j = y;bool flag = false;for(; i < n; i++){for(; j < n; j++){if(map[i][j]=='#'&&isOK(i,j)){map[i][j] = '*';cnt++;dfs(i,j);cnt--;map[i][j] = '#';dfs(i,j);flag = true;break;}}if(flag)break;j = 0;}}int main(){    while(cin>>n>>k){    if(n==-1&&k==-1)break;    cnt = 0;    ans = 0;    for(int i = 0; i < n; i++)cin>>map[i];    dfs(0,-1);cout<<ans<<endl;}}
总结: 深搜. 需要注意的是棋子都是一样的, 还有就是摆放棋子不能在同行同列. 所以可以看做是一个二叉树, 对每个不同行同列的#号, 有两种情况: 放棋子和不放棋子. 因为规模不大, 而且要求求出所有解的数量, 所以这样搜不会超时.

原创粉丝点击