#include <iostream>
#include <algorithm>
#include <set>
#include <stack>
using namespace std;
const int M=10,n=5;
int g[M][M];
typedef struct{
int x;
int y;
}Move;
Move move[4]={{-1,0},{1,0},{0,-1},{0,1}};
stack<int> stk;
set<stack<int> > s;
void dfs(int x,int y)
{
int a,b;
if(stk.size()==6)
{
s.insert(stk); //set判重
return;
}
for(int i=0;i<4;i++)
{
a=x+move[i].x;
b=y+move[i].y;
if(a>=0&&a<n&&b>=0&&b<n)
{
//可以走重复 不用标记
stk.push(g[a][b]); //栈中保存当前路径
dfs(a,b);
stk.pop();//这条路径搜索完毕 换一条路径
}
}
}
int main()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>g[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
dfs(i,j); // 枚举起点后 dfs求路径序列
}
}
cout<<s.size()<<endl;
return 0;
}
poj 3050 dfs+set判重
最新推荐文章于 2018-08-16 22:03:17 发布