zoukankan      html  css  js  c++  java
  • [dfs]SSL 2493 马蹄印

    Description

    虽然当奶牛贝里斯找到平衡序列后很高兴了,但是他现在对序列提出了一个更高的要求,就是要求每个序列中必须是先一定数量的左括号然后是与左括号相同数量的右括号。例如:(((()))),就是一个完美的平衡序列。
    当贝里斯某天在农场上走的时候,他在地上发现了马蹄印,这个农场是一个N*N的方格,每个小方格中都有一个马蹄印。贝里斯希望从方格的最左上角的地方开始出发,然后每次可以向上或者向下或者向左或者向右移动一步,使得他走过的每个小方格中的马蹄印能够组成一个完美的平衡序列。当然了,贝里斯不能重复经过任何小方格。

    请帮助贝里斯在这个N*N的方格中找出长度最长的完美序列的长度。

    题解

    数据范围最大是5
    那么很容易想到dfs
    简单的裸搜题
    

    代码

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int ans,n,a[10][10],visit[10][10],num;
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0};
    char ch;
    bool check(int x,int y)
    {
        if (visit[x][y]==1) return false;
        if (x<1||y<1||x>n||y>n) return false;
        return true;
    }
    void dfs(int dep,int x,int y)
    {
        if (num==0)
        {
            ans=max(ans,dep);
            return;
        }
        for (int i=0;i<=3;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            if (check(xx,yy)==false||a[x][y]==-1&&a[xx][yy]==1) continue;
            num+=a[xx][yy];
            visit[xx][yy]=1;
            dfs(dep+1,xx,yy);
            num-=a[xx][yy];
            visit[xx][yy]=0;
        }
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) 
        {
            scanf("
    ");
            for (int j=1;j<=n;j++)
            {
                scanf("%c",&ch);
                if (ch=='(') a[i][j]=1;
                else a[i][j]=-1;
            }
        }
        if (a[1][1]==-1) 
        {
            printf("0");
            return 0;
        }
        num=1;
        visit[1][1]=1;
        dfs(1,1,1);
        printf("%d",ans);
    }
  • 相关阅读:
    屏幕适配-使用autoLayout
    linux下activemq安装与配置
    1
    java多线程之ForkJoinPool
    Java中线程的使用
    彻底理解数据库事务
    Java中的事务——全局事务与本地事务
    SpringMVC中的几种事务管理器
    Solr5.0.0定时更新索引
    Solr通过配DIH对数据库数据做索引
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412250.html
Copyright © 2011-2022 走看看