題目鏈接: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;
}