问题:Hopscotch POJ - 3050
奶牛们以一种独特的方式玩孩子们的跳房子游戏。 奶牛们创造了一个5x5的格子 他们熟练地跳上其中的一个格子,可以前后左右地跳(不能对角)到另一个格子上。之后继续跳(可能跳到曾经跳过的格子上)。 他们总共跳5次,路径可以看作一个六位数 (准确的说是一个六位序列,如000201是可行的). 请你找到这样的六位序列的总数
Input
* 输入一个5x5的地图
Output
* 所有可能六位序列的总数
Sample Input
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1Sample Output
15
分析:
利用,dfs框架进行枚举,这个枚举比一般的dfs还要简单一些,因为跳过的格子可以重复跳,所以不用在每一次dfs之后撤销一步操作,也就是说不需要一个额外的数组来存储每一个格子走过还是没有走过,每一个节点扩展的时候只需要看是不是会出界即可,这里每一次跳完五步所形成的六位数据可以转变为int类型的一个六位数,我们需要求解的是这样不同的六位数有多少个,所以利用set中无重复元素的特性,最后输出set的size即可,确实是一个水题。。。
代码:
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
int map[10][10],ta[10],ten[]={0,1,10,100,1000,10000,100000};
set<int> s;
void dfs(int i,int j,int n){
if(n==6){
int num=0;
for(int i=1;i<=6;i++){
num+=ta[i]*ten[7-i];
}
s.insert(num);
return;
}
if(i+1<=5){
ta[n+1]=map[i+1][j];
dfs(i+1,j,n+1);
}
if(j+1<=5){
ta[n+1]=map[i][j+1];
dfs(i,j+1,n+1);
}
if(i-1>=1){
ta[n+1]=map[i-1][j];
dfs(i-1,j,n+1);
}
if(j-1>=1){
ta[n+1]=map[i][j-1];
dfs(i,j-1,n+1);
}
}
int main(){
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++){
cin>>map[i][j];
}
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++){
ta[1]=map[i][j];
dfs(i,j,1);
}
cout<<s.size();
return 0;
}