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
原文地址:https://www.cnblogs.com/jaszzz/p/12548655.html