题目网址:https://sim.csp.thusaac.com/contest/38/problem/1

以下解答仅供参考:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

//8种跳跃方向
const int dx[8]={-2,-1,1,2,2,1,-1,-2};
const int dy[8]={1,2,2,1,-1,-2,-2,-1};

int main(){
	int n,k;
	cin>>n>>k;
	int x,y;
	cin>>x>>y;

	//标记格子有没有被走过
	vector<vector<bool>> visited(n+1,vector<bool>(n+1,false));
	//放置坐标(x,y)和步数step
	queue<pair<pair<int,int>,int>> q;

	//将起始点放进队列中,初始步数设置为0
	q.push({{x,y},0});
	//标记起点走过
	visited[x][y]=true;
	int count=0;

	while(!q.empty()){
		//取出队首的格子(当前走到的位置+当前步数)
		//auto相当于pair<pair<int,int>,int>
		auto cur=q.front();
		q.pop();

		int cx=cur.first.first; 	//当前x
		int cy=cur.first.second;    //当前y
		int step=cur.second;

		if(step<=k){
			count++;
		}else{
			continue;
		}
		for(int i=0;i<8;i++){
			int nx=cx+dx[i];    //新x
			int ny=cy+dy[i];    //新y

			//判断新格子是否在棋盘内并且没走过
			if(nx>=1 && nx<=n && ny>=1 && ny<=n && !visited[nx][ny]){
				visited[nx][ny]=true;
				q.push({{nx,ny},step+1});
			}
		}
	}
	cout<<count<<endl;
	return 0;
}

运行结果:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐