Bokoblin的巡逻范围
描述
有一个mm行和nn列的方阵区域,横纵坐标范围分别是0∼m−1和0∼n−1。
一只红色的波克布林从坐标0,0的格子开始巡逻,每一次只能向左,右,上,下四个方向移动一格。
但是不能进入行坐标和列坐标的数位之和大于k的格子。
请问该红色波克布林能够达到多少个格子?
假如输入:k=18, m=40, n=40
则输出是:1484
根据题意思:当k为18时,波克布林能够进入方格(35,37),因为3+5+3+7 = 18。 但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
输入
输入一行,三个整数,由空格隔开,代表k m n
其中:
0<=k<=100
0<=m<=50
0<=n<=50
输出
一个整数,表示红色波克布林能达到的多少格子。
输入样例
18 40 40
输出样例
1484
难度
中,标准广度优先搜索
代码
#include<bits/stdc++.h>
using namespace std;
//得到该数位的和
int get_single_sum(int x)
{
int s = 0;
while(x) s += x % 10, x /= 10;
return s;
}
//求行列个数位的和
int sum(int thread,int row,int col)
{
int ans = 0;
if(get_single_sum(row) + get_single_sum(col) <= thread)
ans = 1;
return ans;
}
//检查是否可以访问
int check(int thread,int rows,int cols,int row,int col,char* visited)
{
int checkAns = 0;
if(row >=0 && col >=0 && row < rows && col < cols && !visited[row * cols + col] && sum(thread,row,col))
checkAns = 1;
return checkAns;
}
int BFS(int thread,int rows,int cols,int row,int col,char* visited)
{
int count = 0;
if(check(thread,rows,cols,row,col,visited))
{
visited[row * cols + col] = 1;
count = 1 + BFS(thread,rows,cols,row - 1,col,visited)
+ BFS(thread,rows,cols,row + 1,col,visited)
+ BFS(thread,rows,cols,row,col - 1,visited)
+ BFS(thread,rows,cols,row,col + 1,visited);
}
return count;
}
int Count(int thread,int rows,int cols)
{
if(thread < 0 || rows < 1 || cols < 1) return 0;
char* visited = (char*)malloc((rows * cols)*sizeof(char));
memset(visited,0,(rows * cols)*sizeof(char));
int count = BFS(thread,rows,cols,0,0,visited);
free(visited);
return count;
}
int main()
{
int rows,cols,thread,ans;
cin>>thread>>rows>>cols;
ans = Count(thread,rows,cols);
cout<<ans;
return 0;
}