zoukankan      html  css  js  c++  java
  • dfs(通过控制点的编号来得出每个点的坐标)

    题目链接:https://cn.vjudge.net/contest/234497#problem/A

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<iomanip>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<vector>
    #include<cmath>
    #include<stdio.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    # define ll long long
    # define ll_inf 0x3f3f3f3f3f3f3f3f
    # define maxn 10+10
    char a[maxn][maxn];
    int n;
    int maxx;
    bool check(int t1,int t2)
    {
        if(t1<0||t1>=n||t2<0||t2>=n)return false;
        int flag1=0,flag2=0,flag3=0,flag4=0;
        for(int i=t2; i<n; i++)
        {
            if(a[t1][i]=='X')break;
            if(a[t1][i]=='a')
            {
                flag1=1;
                break;
            }
        }
        for(int i=t2; i>=0; i--)
        {
            if(a[t1][i]=='X')break;
            if(a[t1][i]=='a')
            {
                flag2=1;
                break;
            }
        }
        for(int i=t1; i<n; i++)
        {
            if(a[i][t2]=='X')break;
            if(a[i][t2]=='a')
            {
                flag3=1;
                break;
            }
        }
        for(int i=t1; i>=0; i--)
        {
            if(a[i][t2]=='X')break;
            if(a[i][t2]=='a')
            {
                flag3=1;
                break;
            }
        }
        if(flag1==0&&flag2==0&&flag3==0&&flag4==0)return true;
        return false ;
    }
    void dfs(int point,int num)
    {
        if(point==n*n)
        {
            maxx=max(maxx,num);
            return ;
        }
        int x=point/n;
        int y=point%n;//通过给二维图里的每个点进行编号,可以直接通过点的编号来求出当前点的横纵坐标
        if(a[x][y]=='.'&&check(x,y))
        {
            a[x][y]='a';
            dfs(point+1,num+1);
            a[x][y]='.';
        }
        dfs(point+1,num);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        while(cin>>n&&n)
        {
            for(int i=0; i<n; i++)//当需要编号时,最好是从0开始,因为判断终止的条件是point是n*n。
            {
                for(int j=0; j<n; j++)
                {
                    cin>>a[i][j];
                }
            }
            maxx=-1;
            dfs(0,0);
            cout<<maxx<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    drf的模型基表与10个单群操作方法
    drf的序列化组件
    drf之请求模块,渲染模块,解析模块,响应模块,异常模块
    drf之接口与接口规范
    MongoDB C# Demo
    如何用Dome4j(2.2.1)创建Xml
    Map、Set的基本概括
    如何自定义xml文件
    HashMap和HashTable的理解与区别
    装箱 拆箱
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262968.html
Copyright © 2011-2022 走看看