POJ 3050 Hopscotch【DFS带回溯】
题意:
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; }