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;
}



發佈了47 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章