POJ 3050 Hopscotch【DFS带回溯】

时间:2023-03-09 02:36:02
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;
}