TZOJ 1646: Hopscotch 深搜+set去重
描述
奶牛以非传统的方式玩孩子的跳房子游戏。奶牛不是要跳入一组线性编号的框,而是创建一个平行于 x 和 y 轴的 5x5 直线数字网格。
然后他们熟练地跳到网格中的任何数字上,并向前、向后、向右或向左(从不斜向)跳到网格中的另一个数字。他们再次(相同的规则)跳到一个数字(可能是一个已经访问过的数字)。
共有五个网格内跃点,它们的跃点创建一个六位数的整数(可能有前导零,如 000201)。
确定可以以这种方式创建的不同整数的数量。
输入
* 第 1..5 行:网格,每行五个整数
输出
* 第 1 行:可以构造的不同整数的数量
样例输入
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
样例输出
15
提示
输出详细信息:
111111、111112、111121、111211、111212、112111、112121、121111、121112、121211、121212、211111、211121、2112111 和 22112 可以构建。没有其他值是可能的。
111111、111112、111121、111211、111212、112111、112121、121111、121112、121211、121212、211111、211121、2112111 和 22112 可以构建。没有其他值是可能的。
题目来源
AC:扫一遍5*5的地图,对于每一个点都要去搜一遍,把每一个能跳的位置都添加到vector中,递归终止条件为vector项目==6时,把vector插入到set中去,靠着set的去重效果,在整个地图深搜遍历结束后,直接输出set的size()即可
#include<iostream> #include<math.h> #include<set> #include<vector> using namespace std; int a[6][6]; set<vector<int> > ss; int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; void dfs(int x,int y,vector<int> v) { if(v.size()==6){ ss.insert(v);return ; } v.push_back(a[x][y]); for(int i=0;i<4;i++) { int tx = x+nex[i][0]; int ty = y+nex[i][1]; if(tx<1||tx>5||ty<1||ty>5)continue; dfs(tx,ty,v); } v.pop_back(); return ; } int main() { for(int i=1;i<=5;i++) { for(int j=1;j<=5;j++)cin>>a[i][j]; } for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++){ vector<int> v; dfs(i,j,v); } } cout<<ss.size(); return 0; }