• 【递归】冲突


    【递归】冲突

    题目描述

    监狱的每间牢房是一个不超过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;
    }
     
  • 相关阅读:
    Druid连接池的简单使用
    JDBC工具包commons-dbutils的基本介绍
    Java IO: ByteArrayOutputStream使用
    开源数据库连接池之Tomcat内置连接池
    jquery里面的$(this)和this的区别
    css自定义属性(css变量)
    CSS选择器
    IntelliJ IDEA 学习笔记
    JSP基本的语法、3个编译指令、7个动作指令、9个内置对象
    CSS3 box-shadow
  • 原文地址:https://www.cnblogs.com/dyzll/p/5645472.html
Copyright © 2020-2023  润新知