poj3050 Hopscotch(暴力dfs)

题意

跳格子,从任意一个点开始跳, 

跳六步会生成一个字符串序列,

求5*5格子上,

能生成出多少个不同的字符串序列。

题解

暴力dfs。

不用标记vis数组剪枝,顺序可能不同,

不用开flag数组使同次访问不同格,一个序列里某个格允许访问多次。

偶槽数据结构课上敲题用C++编译器还爆map的错真是心态爆炸

代码

#pragma warning(disable:4786)
#include <map>
#include <iostream>
#include <algorithm> 
#include <cstring>
#include <string.h>
#include <cstdio>
#include <cmath>
#include <set>
#include <vector>
#include <stack>
#include <queue>
const double INF=0x3f3f3f3f;
const int maxn=1e5+10; 
const int mod=1e9+7;
const int MOD=998244353;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int> 
#define si set<int>
#define pii pair<int,int> 
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
int maze[5][5];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
ll num;
string tmp;
map<string,int>q; 
bool check(int x,int y)
{
	if(x>=0&&x<5&&y>=0&&y<5)return 1;
	return 0;
}
void dfs(int x,int y,int cnt)
{
	char t=maze[x][y]+'0';
	if(cnt==1)
	{
		tmp="";
		tmp=t;
	}
	if(cnt==6)
	{
		if(!q[tmp])num++;
		q[tmp]=1;
		return;
	}
	for(int i=0;i<4;++i)
	{
		int xx=x+dx[i],yy=y+dy[i];
		if(!check(xx,yy))continue;
		char t=maze[xx][yy]+'0';
		tmp+=t;
		dfs(xx,yy,cnt+1);
		tmp=tmp.substr(0,tmp.length()-1);
	}
}
int main()
{ 
   num=0;
   rep(i,0,4)
   {
   	rep(j,0,4)
   	{
   		scanf("%d",&maze[i][j]);
   	} 
   }
   rep(i,0,4)
   {
   	rep(j,0,4)
   	{
   		dfs(i,j,1);
   	}
   }
   printf("%lld\n",num);
   return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code92007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值