poj3050 Hopscotch(暴力dfs)
阿新 • • 發佈:2018-11-09
題意
跳格子,從任意一個點開始跳,
跳六步會生成一個字串序列,
求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; }