POJ 3050 Hopscotch【DFS带回溯】

POJ 3050

题意:

1.5*5的方阵中,随意挑一格,记住这个格子的数字

2.可以上下左右走,走5次,每走一次记录下所走格子的数字

3.经过以上步骤,把所得6个数字连起来,形成一串数字。求共可以形成多少种不同的数字串

思路:

网格大小只有5*5,用穷举法,不会超时。

这里利用了stl中的set容器来防止重复。最终只要输出set的size就是结果。

注意dfs回溯时的编程规范

#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<vector>
#include<set>
#include<stack>
using namespace std;

int a[5][5];
vector<int> v;
set<vector<int> >s;
int dir[][2]={0,1,1,0,0,-1,-1,0};

void dfs(int x,int y,int step)
{
    if(step==5)
    {
        s.insert(v);
        return;
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(nx<0||ny<0||nx>=5||ny>=5)continue;
        v.push_back(a[nx][ny]);
        dfs(nx,ny,step+1);
        v.pop_back();
    }

}

int main()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            cin>>a[i][j];
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
        {
            v.clear();
            v.push_back(a[i][j]);
            dfs(i,j,0);
        }
    cout<<s.size();
    return 0;
}
posted @ 2017-03-15 15:18  demianzhang  阅读(167)  评论(0编辑  收藏  举报