1 条题解

  • 0
    @ 2025-8-24 22:51:54

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Spark_King
    15岁添柴少年

    搬运于2025-08-24 22:51:54,当前版本为作者最后更新于2024-01-03 21:03:54,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P9795 [NERC2018] Easy Chess题解

    我们直入主题——

    算法

    看到题目,我首先能想到的是 DFS(深度优先搜索)

    关于深搜

    这是一种对状态空间进行枚举,通过穷举来找到最优解,或者统计合法解的个数的算法,能够用来求解这道题。

    思路

    具体思路就是对当前棋子可以走的方向和距离进行搜索并保存和更新答案,当步数超过要求时返回,直到搜索到在规定步数内到达目的地时输出答案并结束程序。

    AC CODE

    #include<bits/stdc++.h>
    #define int long long//不开 long long 见祖宗(doge
    using namespace std;
    int n;
    bool mp[10][10];//表示是否访问过
    int cnt, step[70][5];//记录答案
    bool flag;//标记结束
    int dx[5] = {0, 0, 0, 1, -1}, dy[5] = {0, 1, -1, 0, 0};
    void dfs(int x, int y) {
    	if (x == 8 && y == 8 && cnt == n) {
    		for (int i = 1; i <= n; i++) {//输出答案
    			char c = 'a' + (char)(step[i][1] - 1);
             		//因为答案中我们存储的是整型,所以要转化为相应字符
    			cout << c << step[i][2] << " ";
    		}
    		flag = 1;//标记已经找到答案,也可以使用 exist(0)
    		return;
    	}
    	if (cnt == n) return;//当步数超过时返回
       	//这个十分重要,本人因此被卡了十分钟
    	for (int i = 1; i <= 4; i++) {//枚举方向
    		for (int j = 1; j <= 7; j++) {//枚举移动长度
    			int kx = x + dx[i] * j, ky = y + dy[i] * j;
    			if (kx > 8 || kx < 1 || ky > 8 || ky < 1) continue;//排除越界情况
    			if (mp[kx][ky] == 0) {//没有被访问
    				mp[kx][ky] = 1;
    				cnt++;
    				step[cnt][1] = kx, step[cnt][2] = ky;
    				dfs(kx, ky);
    				cnt--;
    				mp[kx][ky] = 0;
    				if (flag == 1) return;//已经找到答案,可以继续返回
    			}
    		}
    	}
    	return;
    }
    signed main() {
    	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//快读
    	cin >> n;
    	cout << "a1 ";//先输出第一个位置
    	mp[1][1] = 1;//注意预处理第一个位置
    	dfs(1, 1);
    	return 0;
    }
    
    • 1

    信息

    ID
    8899
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者