题目传送门

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

题意是给你一个由 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;
}

最新文章

  1. AngularJs2与AMD加载器(dojo requirejs)集成
  2. After the exam
  3. 简单MVC项目搭建--Java1.7+Eclipse luna + Maven 3.2.5 +spring 4.1.4
  4. 一只小蜜蜂...[HDU2044]
  5. javascript设计模式学习之六——代理模式
  6. html之colspan &amp;&amp; rowspan讲解
  7. SQL Server 2008 R2评估期已过的解决办法
  8. solr 范围查询
  9. sql server小技巧-自动添加时间与主键自增长
  10. 分布式系统间通信之RPC的基本概念(六)
  11. 又一编辑神器-百度编辑器-Ueditor
  12. java Socket使用注意
  13. sql server 2008如何导入mdf,ldf文件
  14. hdu_5883_The Best Path(欧拉路)
  15. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
  16. 自定义ViewGroup添加布局动画
  17. 处理soapUI特殊返回报文 【原】
  18. Python 获取类对象的父类
  19. Markdonw基本语法学习
  20. Confluence 6 管理协同编辑 - 最大编辑者的限制

热门文章

  1. Java之路---Day09(继承)
  2. 【转载】C#中List集合使用Max()方法查找到最大值
  3. redux reducer笔记
  4. getElementsByClassName兼容 封装
  5. ABAP-JCO服务错误
  6. Pytorch 张量维度
  7. 【OEM】OEM安装维护
  8. Gitlab创建一个项目(三)使用IntelliJ IDEA开发项目
  9. H3C WLAN相关组织和标准
  10. Linux下设置postgresql数据库开机启动