题意
跳格子,从任意一个点开始跳,
跳六步会生成一个字符串序列,
求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;
}