回溯法
#include<iostream>
using namespace std;
int GetDigitSum(int num)
{
int s=0;
while(num)
{
s += num%10;
num = num/10;
}
return s;
}
int movingCountCore(int threshold,int rows,int cols,int row,int col, bool *visited)
{
int count =0;
if(row>=0 && col>=0 &&row<rows && col<cols && !visited[row*cols+col] && GetDigitSum(row)+GetDigitSum(col)<=threshold)
{
visited[row*cols+col] = true;
count = 1+movingCountCore(threshold,rows,cols,row+1,col,visited)
+movingCountCore(threshold,rows,cols,row-1,col,visited)
+movingCountCore(threshold,rows,cols,row,col+1,visited)
+movingCountCore(threshold,rows,cols,row,col-1,visited);
}
return count;
}
int movingCount(int threshold,int rows,int cols)
{
if(rows<1 || cols<1 )
return 0;
bool *visited = new bool[rows*cols];
memset(visited,0,rows*cols);
int count = movingCountCore(threshold,rows,cols,0,0,visited);
delete []visited;
return count;
}
void test(char* testName, int threshold, int rows, int cols, int expected)
{
if(testName != NULL)
printf("%s begins: ", testName);
if(movingCount(threshold, rows, cols) == expected)
printf("Passed.\n");
else
printf("FAILED.\n");
}
void test1()
{
test("Test1", 5, 10, 10, 21);
}
void test2()
{
test("Test2", 15, 20, 20, 359);
}
void test3()
{
test("Test3", 10, 1, 100, 29);
}
void test4()
{
test("Test4", 10, 1, 10, 10);
}
void test5()
{
test("Test5", 15, 100, 1, 79);
}
void test6()
{
test("Test6", 15, 10, 1, 10);
}
void test7()
{
test("Test7", 15, 1, 1, 1);
}
void test8()
{
test("Test8", -10, 10, 10, 0);
}
int main(int agrc, char* argv[])
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
}