題目描述
地上有一個m行n列的方格,從坐標(biāo) [0,0] 到坐標(biāo) [m-1,n-1] 铝噩。一個機器人從坐標(biāo) [0, 0] 的格子開始移動衡蚂,它每次可以向左、右骏庸、上毛甲、下移動一格(不能移動到方格外),也不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子敞恋。例如丽啡,當(dāng)k為18時,機器人能夠進(jìn)入方格 [35, 37] 硬猫,因為3+5+3+7=18补箍。但它不能進(jìn)入方格 [35, 38],因為3+5+3+8=19啸蜜。請問該機器人能夠到達(dá)多少個格子坑雅?
示例 1:
輸入:m = 2, n = 3, k = 1
輸出:3
示例 2:
輸入:m = 3, n = 1, k = 0
輸出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
解題思路
以行為單位,依次遍歷每一個方格衬横,若方格滿足被進(jìn)入條件則將此網(wǎng)格進(jìn)行標(biāo)記裹粤。判斷條件有如下:
1、一行的第一個方格蜂林,且行坐標(biāo)和列坐標(biāo)的數(shù)位之和不大于k遥诉;
2拇泣、該方格的上面方格或者左方方格被標(biāo)記,且行坐標(biāo)和列坐標(biāo)的數(shù)位之和不大于k矮锈;
終止條件:某一行的所有方格都不能進(jìn)入則終止霉翔。
代碼
int movingCount(int m, int n, int k){
int i, j, sum_i = 0, sum_j = 0, count_sum = 0, count_i = 0;
int visited[m][n];
for (i = 0; i < m; i++)
{
count_i = 0;
sum_i = i / 10 + i % 10;
for (j = 0; j < n; j++)
{
sum_j = j / 10 + j % 10;
if(((j == 0) || ((j > 0) && (visited[i][j - 1] == 1)) || ((i > 0) && (visited[i - 1][j] == 1))) && (sum_i + sum_j <= k))
{
visited[i][j] = 1;
count_i++;
}
else
{
visited[i][j] = 0;
}
}
// 若其中某行沒有任何一個滿足條件的格子,則結(jié)束
if(count_i == 0)
{
break;
}
else
{
count_sum += count_i;
}
}
return count_sum;
}
測試代碼及結(jié)果
#include<stdio.h>
int main(void)
{
int count1, count2, count3, count4;
// 功能測試
count1 = movingCount(10, 10, 15);
printf("%d\n", count1);
count2 = movingCount(5, 4, 6);
printf("%d\n", count2);
// 邊界值測試
count3 = movingCount(5, 1, 2); // 多行一列
printf("%d\n", count3);
count4 = movingCount(1, 8, 5); // 一行多列
printf("%d\n", count4);
// 特殊輸入測試
count3 = movingCount(3, 3,-2); // k為負(fù)數(shù)
printf("%d\n", count3);
}
執(zhí)行代碼
時間復(fù)雜度:O(n) = n^2苞笨,空間復(fù)雜度:O(1)债朵。