题目大致意思:
1.5*5的方阵中,先随意挑一格,记住这个格子的数字
2.可以上下左右走,走5次,每走一次记录下所走格子的数字
3.经过以上步奏,把总共6个数字连起来,形成一串数字。求总共可以形成多少种不同的数字串
分析:总状态数较少,把每个位置都当做起点遍历一遍,用map<string,int >记录是否重复。
收获:这种能回头的BFS第一次做,用限制步数来保证搜索范围
AC:
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <string.h>
#include <stdio.h>
using namespace std;
int p1[10][10];
char p[10][10];
map <string,int> mp;
int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};
struct Point
{
int x,y;
string s;
};
int bfs(int bx,int by)
{
Point now;
queue<Point> que;
string s1="";
int sum = 0;
Point k;
k.x=bx,k.y=by,k.s="";
que.push(k);
while(que.size())
{
Point q=que.front();
que.pop();
for(int i=0; i<4; i++)
{
now.x=q.x+dx[i];
now.y=q.y+dy[i];
now.s=q.s+p[now.x][now.y];
if(now.x>4||now.x<0||now.y>4||now.y<0) continue;
if(now.s.size()==6)
{
if(mp[now.s]==0)
{
sum++;
mp[now.s]=1;
// cout << now.s <<" "<<now.s.size()<< endl;
}
}
if(now.s.size()<6) que.push(now);
}
}
return sum ;
}
int main ()
{
memset(p,0,sizeof(p));
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
scanf("%d",&p1[i][j]);
char ch=p1[i][j]+'0';
p[i][j]=ch;
}
}
// for(int i=0; i<5; i++)
// {
// for(int j=0; j<5; j++)
// {
// cout << p[i][j] ;
// }
// cout <<endl;
//
// }
int sum = 0;
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
sum += bfs(i,j);
}
}
cout << sum ;
return 0;
}