题目链接: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;
}