// test20.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<string.h>
#include<deque>
#include <forward_list>
using namespace std;
class Solution {
public:
vector<vector<bool>> flag; //訪問標志,
int movingCount(int threshold, int rows, int cols)
{
for (int i = 0;i < rows;++i)//沒有訪問過設置為true
{
vector<bool> vec;
for (int j = 0;j < cols;++j)
{
vec.push_back(false);
}
flag.push_back(vec);
}
return movCount(threshold, rows, cols,0,0) ;
}
//此函數為回溯函數
int movCount(int threshold, int rows, int cols,int i,int j)//訪問的是當前的單元
{
if (i < 0 || i >= rows || j < 0 || j >= cols || !LegalOrNot(threshold, i, j) || flag[i][j]) return 0;
flag[i][j] = true;
return movCount(threshold, rows, cols, i - 1, j) +
movCount(threshold, rows, cols, i + 1, j) +
movCount(threshold, rows, cols, i , j-1) +
movCount(threshold, rows, cols, i , j+1) +1;
}
//此函數為來標注該格子是否是合法的,可以允許訪問
bool LegalOrNot(int threshold, int row, int col)
{
int num = 0;
while (row != 0)
{
num = num + row % 10;
row = row / 10;
}
while (col != 0)
{
num = num + col % 10;
col = col / 10;
}
if (num <= threshold)
return true;//合法訪問
return false;
}
};
int main()
{
Solution so;
//cout << 1 / 10 << endl;
cout << "數量為:" << so.movingCount(10, 1, 100) << endl;
return 0;
}