1. 程式人生 > >poj3050 Hopscotch(暴力dfs)

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;
}