zoukankan      html  css  js  c++  java
  • POJ 3050 (Hopscotch)

    题目链接:http://poj.org/problem?id=3050

    题意:问从5*5的矩阵中选连续的6个(可重复)组成的字符串有多少种

    思路:这也是一道规模不是太大的题目,还是暴力搜索。

       难点在于判断是否有重复,一开始的想法是把字符串练成一个六位数再排序后逐个比较,(其实也可以这样做)但是这样把题目的规模就增大了,所以采用C++ STL中 set 容器。

    ac代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <set>
    using namespace std;
    int s[6][6];
    int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
    set<int> st;
    
    void dfs(int x,int y,int num,int val){
        if(num==6){
            st.insert(val);        //set真的太好用啦,有重复数字的去重效率也很高
            return;
        }
    
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx>=0&&nx<5&&ny>=0&&ny<5){
                num++;
                dfs(nx,ny,num,val*10+s[nx][ny]);
                num--;    //这是一个坑,一开始老是忘记要还原,就邦邦邦的报错
            }
        }
    }
    
    int main(void){
    
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                scanf("%d",&s[i][j]);
            }
            getchar();
        }
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
                dfs(i,j,1,s[i][j]);
    
        // printf("%d
    ",st.size());
        cout<<st.size()<<endl;
    
        return 0;
    }
    View Code
  • 相关阅读:
    c语言几个字符串处理函数的简单实现
    各种类型排序的实现及比较
    随机洗牌算法Knuth Shuffle和错排公式
    两个栈实现队列
    面试杂题
    面试题——栈的压入、弹出顺序
    Codeforces 455A. Boredom
    PAT A1049. Counting Ones (30)
    Codeforces 895B. XK Segments
    Codeforces 282C. XOR and OR
  • 原文地址:https://www.cnblogs.com/jaszzz/p/12548655.html
Copyright © 2011-2022 走看看