zoukankan      html  css  js  c++  java
  • dfs密码//

    在Cafebazaar工作了几个月后,Farhad变得足够富有,可以在富人谷购买房屋。在那儿他遇到了Shirin几次。现在,他正在考虑向她提议她是否愿意嫁给他,让她感到惊讶的是,他想在她的手机上安装一个应用程序,该应用程序会在正确的时间弹出,并询问她是否愿意嫁给他。
    但是,要秘密安装该应用程序,他需要她的密码,但不幸的是他没有该密码。他知道她的密码是由垂直或水平线段组成的折线。每个线段都以3×3网格连接两个单元的中心。在解锁手机的同时看着她的手,法拉德了解了每个线段的方向。但是,他太分心了,无法学习每个段的长度。他还知道,她的手机的操作系统甚至不允许折线在一个点上相交。
    Farhad希望足够长时间分散Shirin的注意力,以尝试他已经知道的所有可能的模式。不幸的是,他不知道要花多长时间。因此,他现在向您求助。通过编写一个程序来帮助他,该程序在给定线段方向的情况下计算可能的密码模式总数。下图描述了两个有效模式和一个无效模式,假设线段分别按顺序指向右,下,左和上。

    In the only line of the input, a single string is given consisting of characters R, U, L, and D which represent a line segment toward right, up, left, and down, respectively. The length of this string is at most 10. Every two consecutive characters is guaranteed to be different.

    输出

    In the only line of the output, print the number of patterns satisfying Farhad’s knowledge of the password. Note that this number might be zero.
    【样例1】
    DRU
    【样例2】
    R

    样例输出 Copy

    【样例1】
    15
    【样例2】
    9
    解释:
    就是给你一个字符串其中包括(D向上,R向右,U向上,L向左),问你就是在一个3*3的网格上能能连成的图案的个数
    就是两条边不能相交。
    #pragma GCC optimize(1)
    #pragma GCC optimize(2)
    #pragma GCC optimize(3,"Ofast","inline")
    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll;
    const int maxn=1e4+100;
    int vis[10][10];
    string a;
    int len,ans;
    void dfs(int x,int y,int t){//坐标x,y,和字符串哪一个 
        if(t>=len){
            ans++;
        }
        if(a[t]=='D'){//
            bool flag=false;
            if(x+1<=3&&!vis[x+1][y]){//连一步 
                vis[x+1][y]=1;
                flag=true;
                dfs(x+1,y,t+1); 
                vis[x+1][y]=0;
                 
            }
            if(x+2<=3&&!vis[x+1][y]&&!vis[x+2][y]){//连两步就是要考虑第一步不能相连 
                vis[x+2][y]=1;
                vis[x+1][y]=1;
                flag=true;
                dfs(x+2,y,t+1);
                vis[x+2][y]=0;
                vis[x+1][y]=0;
             
            }
            if(!flag) return;
        }
        else if(a[t]=='U'){
            bool flag=false;
            if(x-1>=1&&!vis[x-1][y]){
                vis[x-1][y]=1;
                flag=true; 
                dfs(x-1,y,t+1);
                vis[x-1][y]=0;
                 
            }
            if(x-2>=1&&!vis[x-1][y]&&!vis[x-2][y]){
                vis[x-2][y]=1;
                vis[x-1][y]=1;
                flag=true;
                dfs(x-2,y,t+1);
                vis[x-1][y]=0;
                vis[x-2][y]=0;
                 
            }
            if(!flag) return;
        }
        else if(a[t]=='R')//
        {
            bool flag=false;
            if(y+1<=3&&!vis[x][y+1]){
                vis[x][y+1]=1;
                flag=true;
                dfs(x,y+1,t+1);
                vis[x][y+1]=0; 
            }
            if(y+2<=3&&!vis[x][y+1]&&!vis[x][y+2]){
                vis[x][y+2]=1;
                vis[x][y+1]=1;
                flag=true;
                dfs(x,y+2,t+1);
                vis[x][y+2]=0;
                vis[x][y+1]=0;
            }
            if(!flag) return;
        } 
        else if(a[t]=='L'){
            bool flag=false;
            if(y-1>=1&&!vis[x][y-1]){
                vis[x][y-1]=1;
                flag=true;
                dfs(x,y-1,t+1);
                vis[x][y-1]=0; 
            }
            if(y-2>=1&&!vis[x][y-1]&&!vis[x][y-2]){
                vis[x][y-2]=1;
                vis[x][y-1]=1;
                flag=true;
                dfs(x,y-2,t+1);
                vis[x][y-2]=0;
                vis[x][y-1]=0;
            }
            if(!flag) return;
        } 
    }
    int main(){
        cin >> a;
        len = a.size();
        for(int i = 1;i <= 3;i++){
            for(int j = 1;j <= 3;j++){
                memset(vis,0,sizeof vis);
                vis[i][j]=1;//把开头i,j标记 
                dfs(i,j,0);
            } 
        }
        cout << ans << endl;
    }
     
    
    
    
     
  • 相关阅读:
    shell脚本计算斐波那契数列
    SQL查询出某字段不等于某值的行(其中有为NULL的字段)
    如何修改和关闭1433端口
    SqlServer 数据库日志无法收缩处理过程
    人生的抉择—aspx、ashx、asmx文件处理请求效率比较
    HTTP 错误 500.21
    如何使用快照来初始化化请求订阅
    怎么改svn的登陆账号
    更换用installshield打包生成exe文件的图标【转】
    win10下怎么在桌面创建IIS快捷方式
  • 原文地址:https://www.cnblogs.com/lipu123/p/13751506.html
Copyright © 2011-2022 走看看