poj3050

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

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

解题思路:从数据量量来看,这道题目用暴搜的方法就可以解决,但是,暴搜之后得到的答案有很多是一样。那么如何快速的判断是否重复呢?这里我使用了C++ STL中set容器。把遍历所得到的数据全部都放入set容器中,set容器是采用平衡树(红黑树)实现其元素在内存中的存储,效率很高。

#include <iostream>
#include <set>
using namespace std;
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
int pos[6][6];
set<int> st;
void dfs(int i,int j,int value,int num)
{
    if(num==6)
    {
        st.insert(value);
        return;
    }
    for(int k=1;k<=4;k++)
    {
        int nx=i+dx[k];
        int ny=j+dy[k];
        if(nx>=1&&nx<=5&&ny>=1&&ny<=5)
        {
            num++;
            dfs(nx,ny,10*value+pos[nx][ny],num);
            num--;
        }

    }
}
void solve()
{
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            dfs(i,j,pos[i][j],1);
    cout<<st.size()<<endl;
}
int main()
{
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            cin>>pos[i][j];
    solve();
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值