【递归】冲突

【递归】冲突

题目描述

监狱的每间牢房是一个不超过4×4的正方形,里面设有一些障碍,牢房里住着的犯人脾气都很大,只要两个犯人位于同一行或同一列即会发生冲突,但障碍物可以阻挡同行或同列犯人的冲突。问最多可放几个犯人而不会发生冲突。如下图所示,左边表示初始牢房样,右边4个显示了摆放方案,当然,最后两个方案是错误的。

输入

有多组测试数据,每组数据第一行为一个整数N表示牢房大小。随后N行描述牢房,其中X表示障碍。

所有测试数据结束的标志为0。

输出

输出最多可放的犯人数。

样例输入

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0

样例输出

5
1
5
2
4

分析:由于数据范围很小,直接暴力搜即可;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <ext/rope>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=10;
const int dis[][2]={0,1,-1,0,0,-1,1,0};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,ma;
char a[maxn][maxn];
void dfs(int p,int cnt)
{
    if(p==n*n){ma=max(ma,cnt);return;}
    int x=p/n,y=p%n;
    dfs(p+1,cnt);
    if(a[x][y]=='.')
    {
        int ok=1;
        for(int i=x;i<=n-1;i++){if(a[i][y]=='X')break;if(a[i][y]=='Q')ok=0;}
        for(int i=x;i>=0;i--){if(a[i][y]=='X')break;if(a[i][y]=='Q')ok=0;}
        for(int i=y;i<=n-1;i++){if(a[x][i]=='X')break;if(a[x][i]=='Q')ok=0;}
        for(int i=y;i>=0;i--){if(a[x][i]=='X')break;if(a[x][i]=='Q')ok=0;}
        if(ok)a[x][y]='Q',dfs(p+1,cnt+1),a[x][y]='.';
    }
}
int main()
{
    int i,j,k,t;
    while(~scanf("%d",&n)&&n)
    {
        ma=0;
        rep(i,0,n-1)scanf("%s",a[i]);
        dfs(0,0);
        printf("%d
",ma);
    }
    //system("pause");
    return 0;
}
 
原文地址:https://www.cnblogs.com/dyzll/p/5645472.html