奶牛们以一种独特的方式玩孩子们的跳房子游戏。 奶牛们创造了一个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 1
Sample Output
15
Hint
输出说明
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111,和 212121 是可行的. 没有其他可行的了
一看这个地图这个怎么搜呢,怎么用来计数呢?最后搜出来的结怎么表示呢?
这个题的数据量是比较小的,都以我们就开始大爆搜(DFS),但是最后结果是用什么表示的呢?最后走了五步,出现了一个六位数的串,我们就可以按照这个串来看看一共有多少不同的六位数,但是怎么来看不同的六位数呢?我们可以将数据插入到set 容器中,会有自动去重的效果。
代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<queue>
#include<algorithm>
const int maxn=5005;
typedef long long ll;
using namespace std;
typedef pair<ll,ll> p;
#include<set>
int a[]={1,-1,0,0};
int b[]={0,0,1,-1};
int maap[maxn][maxn];
set<int>mp;
void dfs(int x,int y,int step,int num)
{
int i=0;
if(step==5)
{
mp.insert(num);
return ;
}
for(i=0;i<4;i++)
{
int xx=x+a[i];
int yy=y+b[i];
if(xx>=1&&yy>=1&&xx<=5&&yy<=5)
dfs(xx,yy,step+1,num*10+maap[xx][yy]);
}
}
int main()
{
int i,j;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
cin>>maap[i][j];
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
dfs(i,j,0,maap[i][j]);
cout<<mp.size()<<endl;
return 0;
}
新颖的思路。