题目传送门

本题知识点:深度优先搜索 + 回溯 + 剪枝 + 字典序

题意是给你一个由 p,q 组成一个矩形的棋盘,让你用马棋在这上面走,是否能一线走完这 p * q 个格子。

关于这条路线是怎么走的,自己动手在纸上模拟一下样例3棋子行走的过程就可以了。

所以这种一线走完的题意可以很清楚地想到是深搜。

我第一次写的时候是没有回溯的,没有回溯的话,就会走回路,提交了一遍WA了,所以这里是不能走回路的,必须要用回溯。

如果都能走到的话,那所走的步数肯定是 p * q,所以这里是判断是否已走完的一个判断。当已达成的话,所得到的路径肯定是答案的路径(至于为什么,我也说不出个好证明来tclquq),得到这个路径后,就要进行剪枝,即中断搜索。

题目输出要求是路径输出要按照字典序输出,所以深搜时的方向一定先要按照字典序方向去走(这里也请大家自己思考一下,怎样走才是最小的字典序)。因为这个字典序差点搞崩我心态,所以大家一定要耐心看清楚题目啊,当思路都没问题时,重新读下题目是很重要的。另外,输出时候还要多一个换行符。

下面请看下代码吧

// POJ 2488
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
using namespace std; bool take[10][10];
int T, H, W;
int ans_size, temp_size;
string ans[30], temp[30];
bool ok;
//vector<string> temp, ans; // WA 的行走模式
//int rh[] = { 2, 2, 1, -1, -2, -2, -1, 1 };
//int rw[] = { -1, 1, 2, 2, 1, -1, -2, -2 };
// AC 的行走模式
int rh[] = { -1, 1, -2, 2, -2, 2, -1, 1 };
int rw[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; void dfs(int h, int w){
take[h][w] = true; if(temp_size == H * W){
ok = true;
ans_size = 0;
for(int i = 0; i < temp_size; i++){
// ans.push_back(temp[i]);
ans[ans_size++] = temp[i];
}
return ;
} for(int i = 0; i < 8; i++){
int nh = h + rh[i], nw = w + rw[i];
if(1 <= nh && nh <= H && 1 <= nw && nw <= W && !take[nh][nw]){
string a = "";
a += (char)(nw - 1 + 'A');
a += (char)(nh + '0');
temp[temp_size++] = a;
// temp.push_back(a);
dfs(nh, nw);
temp_size--; // 回溯
if(ok) return ; // 剪枝
// temp.pop_back();
}
}
take[h][w] = false;
} int main()
{
// freopen("test.txt", "r", stdin);
scanf("%d", &T);
for(int k = 1; k <= T; k++) {
ok = false;
memset(take, false, sizeof(take));
// ans.clear();
// temp.clear();
ans_size = temp_size = 0;
scanf("%d %d", &H, &W);
string a = "A1";
temp[temp_size++] = a;
// temp.push_back(a);
dfs(1, 1); printf("Scenario #%d:\n", k);
if(ans_size == H * W){
for(int i = 0; i < ans_size; i++){
cout << ans[i];
} cout << endl;
}
else cout << "impossible\n";
cout << endl;
}
return 0;
}

【POJ2488】A Knight's Journey的更多相关文章

  1. 【leetcode】688. Knight Probability in Chessboard

    题目如下: On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exa ...

  2. 【UVa】439 Knight Moves(dfs)

    题目 题目     分析 没有估价函数的IDA......     代码 #include <cstdio> #include <cstring> #include <a ...

  3. 【leetcode】935. Knight Dialer

    题目如下: A chess knight can move as indicated in the chess diagram below:  .            This time, we p ...

  4. 【LeetCode】935. Knight Dialer 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划TLE 空间换时间,利用对称性 优化空间复杂 ...

  5. 【LeetCode】688. Knight Probability in Chessboard 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/knight-pr ...

  6. 【BZOJ】2657: [Zjoi2012]旅游(journey)(树的直径)

    题目 传送门:QWQ 分析 在任意两个不相邻的点连一条线,求这条线能穿过几个三角形. 建图比较讲究(详见代码) 求树的直径. 代码 #include <bits/stdc++.h> usi ...

  7. 【题解】CF356A Knight Tournament

    题面传送门 本蒟蒻想练习一下并查集,所以是找并查集标签来这里的.写题解加深理解. 解决思路 自然,看到区间修改之类很容易想到线段树,但本蒟蒻线段树会写挂,所以这里就讲比较简单的并查集思路. 并查集的核 ...

  8. CDOJ 92 – Journey 【LCA】

    [题意]给出一棵树,有n个点(2≤N≤105),每条边有权值,现在打算新修一条路径,给出新路径u的起点v,终点和权值,下面给出Q(1≤Q≤105)个询问(a,b)问如果都按照最短路径走,从a到b节省了 ...

  9. 【bfs】Knight Moves

    [题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...

随机推荐

  1. 分享AWS网站

    1.AWS服务运行状况检测网站:   https://status.amazonaws.cn/ 2.AWS架构白皮书:https://aws.amazon.com/cn/architecture/?a ...

  2. permission 权限清单

    <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permiss ...

  3. 米尔电子i.MX8开发板评测

    基于 NXP 公司的i.MX8M 系列芯片的高性能开发平台 MYD-JX8MX开发板.是采用核心板(MYC-JX8MX)加底板(MYB-JX8MX)的形式,提供了 HDMI,LVDS(或 MIPI), ...

  4. 电缆公司如何面对企业改革?MES系统打造智能工厂

    项目背景 目前,“互联网+电缆”正在成为电缆行业发展的主流,作为中国领先的大型电缆企业江苏亨通电力电缆有限公司(简称“亨通电缆”)积极响应国家提出的“中国制造2025”号召,实施MES工程项目,启用智 ...

  5. WinRAR捆绑木马

    准备好木马文件 server.exe 准备一个小游戏 趣味数学计算 压缩 创建自解压格式压缩文件 自解压选项设置 解压路径设置 设置程序 模式设置 压缩完成 使用 开始玩游戏

  6. [LeetCode] 198. 打家劫舍 ☆(动态规划)

    描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个 ...

  7. 关于Spring IOC (DI-依赖注入)你需要知道的一切

    <Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...

  8. Github 上 36 个最实用的 Vue 开源库

    任何一个开发者,都是十分喜欢使用开源软件包的.因为它使开发工作变得更快速.高效.容易.如果没有开源软件包,开发工作将变得疲惫不堪,不断的重复造轮子! 下面整理了 Github 上 36 个实用的 Vu ...

  9. pstree - 树状显示进程信息

    pstree - display a tree of processes(树状结构显示进程关系) 格式: pstree [option] option: -a --arguments:显示每个程序的完 ...

  10. MySQL/MariaDB数据库的复制加密

      MySQL/MariaDB数据库的复制加密 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的安全问题 1>.基于SSL复制 在默认的主从复制过程或远程连接 ...