Hopscotch POJ - 3050(奇异DFS)

奶牛们以一种独特的方式玩孩子们的跳房子游戏。 奶牛们创造了一个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;
}

新颖的思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值