给定一个 n×m 的二维矩阵,其中的每个元素都是一个 [1,9]
之间的正整数。
从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。
走了 k
次后,经过的元素会构成一个 (k+1)
位数。
请求出一共可以走出多少个不同的 (k+1)
位数。
输入格式
第一行包含三个整数 n,m,k
。
接下来 n
行,每行包含 m
个空格隔开的整数,表示给定矩阵。
输出格式
输出一个整数,表示可以走出的不同 (k+1)
位数的个数。
数据范围
对于 30%
的数据, 1≤n,m≤2,0≤k≤2
对于 100% 的数据,1≤n,m≤5,0≤k≤5,m×n>1
输入样例:
3 3 2
1 1 1
1 1 1
2 1 1
输出样例:
5
算法1
// 本题解仅仅是自己有些想法想记录下来,本人菜鸡,如有不当欢迎指正,谢谢
(暴力枚举) O(n2)
思路其实很简单,但在写完代码后,总是Memory Limi Exceeded
很纳闷,于是查看了别人写的代码
https://www.acwing.com/solution/content/49182/
发现了几个不同的地方
(1)我是自己定义的vis数组,而该大佬用的是unordered_map
// #include [HTML_REMOVED] // unorderer_map [HTML_REMOVED] vis
但是发现改过之后,仍然不对
(2)大佬的dfs用的是k从0到k+1, 而我用的是k到1; 大佬的输入是1-n, 而我是0-n-1, 而且对应的边界条件也有问题
于是对照着改了一会,发现自己写的边界条件越界了,于是把自己的输入改成1-n之后,对应的边界条件改一下,就可以ac
于是继续对自己以前的边界和k的遍历方式进行更改也都可以AC(只要把边界条件控制好)
// 这里发现,在设置边界条件的时候,最好不要用等于,直接>/<, 不要>= / <= , 不然感觉容易乱
(3)大佬的k遍历了k+2次
理解:大佬的dfs的判断条件是在父函数中,所以,搜索到边界条件的时候,其实是不会走下去的,这是就需要+1,这时注意,题目给的是走出k+1位数,所以搜索就应该是k+2次
C++ 代码
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
// const int N = 1e6+10;
const int N = 10;
int n, m, k;
int map[7][7];
// int vis[N];
unordered_map [HTML_REMOVED] vis;
int ans;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
void search (int nn , int sum , int x , int y ) {
if (nn == k+1) {
// sum*= 10;
// sum+= map[x][y];
if (!vis[sum]) {
ans++;
vis[sum] = 1;
}
}
else {
for(int i = 0;i < 4;i ++)
{
int a = x + dx[i], b = y + dy[i];
if(a <= 0 || a > n || b <= 0 || b > m) continue;
search ( nn+1 , sum*10+map[x][y] , a , b );
}
//printf ( "tans = %d\n", sum*10+map[x][y] );
// search ( nn-1, sum*10+map[x][y] , x+1 , y+1 );
// search ( nn-1, sum*10+map[x][y] , x-1 , y+1 );
// search ( nn-1, sum*10+map[x][y] , x+1 , y-1 );
// search ( nn-1, sum*10+map[x][y] , x-1 , y-1 );
}
return ;
}
int main () {
cin>> n>> m>> k;
for ( int i = 1 ; i <= n ; i ) {
for ( int j = 1 ; j <= m ; j ) {
cin>> map[i][j];
}
}
ans = 0;
//memset (vis , 0 , sizeof(vis)) ;
for ( int i = 1 ; i<= n ; i++ ) {
for ( int j = 1 ; j<= m ; j++ ) {
search (0 , 0 , i , j );
}
}
cout<< ans<< endl;
return 0;
}