Hopscotch
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4071 | Accepted: 2708 |
Description
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.
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.
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, and 212121 can be constructed. No other values are possible.
Source
题目大意:给你一个5*5的数字表格,问从任一数字出发所生成的6步排列有几种?
解题思路:对每个元素进行dfs,把每次dfs的结果放到set里防止重复。保存6步的方法:把1 2 1 2 1 1这个路径变成数字121211即可。
代码如下:
#include <cstdio>
#include <queue>
#include <set>
#include <iostream>
#include <string>
using namespace std;
int Map[5][5];
int dirx[4]={-1,1,0,0};
int diry[4]={0,0,-1,1};
set<int> s;
int judge(int x,int y)
{
if(x>=0&&x<5&&y>=0&&y<5)
{
return 1;
}
else
{
return 0;
}
}
void dfs(int hang,int lie,int sum,int depth)
{
if(depth==6)
{
s.insert(sum);//如果里面已存在该情况,那么s的size不会变
return ;
}
for(int i=0;i<4;i++)
{
int nextx=dirx[i]+hang;
int nexty=diry[i]+lie;
if(judge(nextx,nexty))
{
dfs(nextx,nexty,sum*10+Map[hang][lie],depth+1);//第三个参数把路径转化成数字
}
}
}
int main()
{
s.clear();
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
scanf("%d",&Map[i][j]);
}
}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
dfs(i,j,0,0);
}
}
printf("%d\n",s.size());
return 0;
}