zoukankan      html  css  js  c++  java
  • poj3050

    一、题意:有一个5*5的矩形,每个单元格有一个数字。可以从任一个单元格出发,然后可朝上下左右四个方向移动。走五步即可得到一个六位数(可以有前导零),求能得到的不同六位数最多有多少个。

    二、思路:以每个单元格为起点,进行dfs。每次dfs的深度是6,然后记录下所得到的这个6位数。可以把每次得到的这个六位数变成string类型,然后存在string类型的set中,最后输出set中元素个数即可。但是实践证明这样做TLE了,因为整型转字符串已经判断很耗时。其实可以直接存数字,即使有前导零也无所谓,不影响结果。

    三、代码:

    #include"iostream"
    #include"stdio.h"
    #include"queue"
    #include"string"
    #include"set"
    #include"sstream"
    using namespace std;
    
    int house[6][6];
    set<int> s;
    
    bool Judge(int x,int y)
    {
        if(x>=0&&x<5&&y>=0&&y<5)
            return true;
        return false;
    }
    
    void Dfs(int x,int y,int steps,int num)
    {
        if(steps==5)
        {
            s.insert(num);
            return;
        }
        int dx[4]={1,0,-1,0};
        int dy[4]={0,1,0,-1};
    
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
    
            if(Judge(nx,ny))
            {
                num=num*10+house[nx][ny];
                Dfs(nx,ny,steps+1,num);
                num=(num-house[nx][ny])/10;
            }
        }
    }
    
    int main()
    {
       // freopen("in.txt","r",stdin);
        while(scanf("%d",&house[0][0])==1)
        {
            for(int j=1;j<5;j++)
                scanf("%d",&house[0][j]);
            for(int i=1;i<5;i++)
            {
                for(int j=0;j<5;j++)
                    scanf("%d",&house[i][j]);
            }
            s.clear();
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<5;j++)
                    Dfs(i,j,0,house[i][j]);
            }
            cout<<s.size()<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    欧拉函数
    新博客地址
    socket编程
    文件操作
    python安装扩展”unable to find vcvarsall.bat“的解决办法
    PYTHON以及插件安装
    梯式结构
    PHPSTORM配置
    CSRF攻击
    js的一些奇葩用法
  • 原文地址:https://www.cnblogs.com/acm-jing/p/9614921.html
Copyright © 2011-2022 走看看