Hopscotch
The cows play the child’s game of hopscotch in a non-traditional way. Instead of a linear set of numbered boxes into which to hop, the cows create a 5x5 rectilinear grid of digits parallel to the x and y axes.
They then adroitly hop onto any digit in the grid and hop forward, backward, right, or left (never diagonally) to another digit in the grid. They hop again (same rules) to a digit (potentially a digit already visited).
With a total of five intra-grid hops, their hops create a six-digit integer (which might have leading zeroes like 000201).
Determine the count of the number of distinct integers that can be created in this manner.
Input
Lines 1~5: The grid, five integers per line
Output
Line 1: The number of distinct integers that can be constructed
Sample Input
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
Sample Output
15
Hint
OUTPUT DETAILS:
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, and 212121 can be constructed. No other values are possible.
C++编写:
深度优先搜索
#include<iostream>
#include<cstring>
using namespace std;
int sum,num;
int a[1000000]; //储存某一个数字是否已经走出来过
int grid[5][5]; //用于记录格子中每格的数据
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; //用于上、下、左、右的移动
void dfs(int x,int y,int k)
{
if(k==6)
{
if(a[num]==0)
{
sum++;
a[num]=1; //已经走出来过该数字则记录该点状态值为1
return;
}
else return;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<5 && ny>=0 && ny<5)
{
num*=10;
num+=grid[nx][ny];
dfs(nx,ny,k+1);
num/=10; //此处注意把num变回来,因为还要进行下一次循环
}
}
return;
}
int main()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
cin>>grid[i][j];
}
memset(a,0,sizeof(a));
sum=0,num=0;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
dfs(i,j,0);
}
cout<<sum<<endl;
}