POJ2488 A Knight's Journey(DFS)
2016-02-23 14:58
429 查看
题意:
输入一些棋盘对应的行和列,看骑士(日字)能不能走完整个棋盘,可以从任何地方开始,注意要字典序输出
要点:
虽然说骑士可以从棋盘上任意一点出发,但因为要按字典序(lexicographically)输出,所以当然从A1出发字典序最小,不用担心为什么任意一点变成A1也行,因为反正是可以走过整个棋盘,那么肯定经过A1,那么其实是连着的一个环,从哪一点出发都无所谓。而且还有对应的走的顺序是要固定的,也即是要照字典序小的先走,x要从小到大(-2到2),这个次序是特殊的,其他的就是普通的DFS。
输入一些棋盘对应的行和列,看骑士(日字)能不能走完整个棋盘,可以从任何地方开始,注意要字典序输出
要点:
虽然说骑士可以从棋盘上任意一点出发,但因为要按字典序(lexicographically)输出,所以当然从A1出发字典序最小,不用担心为什么任意一点变成A1也行,因为反正是可以走过整个棋盘,那么肯定经过A1,那么其实是连着的一个环,从哪一点出发都无所谓。而且还有对应的走的顺序是要固定的,也即是要照字典序小的先走,x要从小到大(-2到2),这个次序是特殊的,其他的就是普通的DFS。
15190196 | Seasonal | 2488 | Accepted | 172K | 16MS | C++ | 1009B | 2016-02-23 14:17:02 |
#include<stdio.h> #include<string.h> #include<stdlib.h> int visit[30][30]; int p, q; char path[1050][2]; int d[8][2] = { {-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1} };//这里有特殊的顺序的,要尽量使字母小 bool flag; void dfs(int x,int y,int count) { int i, j; if (count == p*q) { for (int i = 0; i<count; i++) printf("%c%d", path[i][0] + 'A', path[i][1] + 1); printf("\n"); flag = true; return; } for (i = 0; i < 8; i++) { int xx = x + d[i][0]; int yy = y + d[i][1]; if (xx >= 0 && xx < q&&yy >= 0 && yy < p&&!visit[xx][yy]&&!flag) { visit[xx][yy] = 1; path[count][0] = xx;path[count][1] = yy; dfs(xx, yy,count+1); visit[xx][yy] = 0; //如果不成功要回退 } } } int main() { int t; scanf("%d", &t); for (int k = 1; k <= t;k++) { flag = false; scanf("%d%d", &p, &q); memset(visit, 0, sizeof(visit)); visit[0][0] = 1; path[0][0] = 0, path[0][1] = 0;//从A1开始一定字典序最小 printf("Scenario #%d:\n", k); dfs(0, 0,1); if (!flag) printf("impossible\n"); printf("\n"); } return 0; }
相关文章推荐
- 经典数据挖掘算法(介绍了包括18大数据挖掘在内的多种经典数据挖掘算法)
- POJ 2524 Ubiquitous Religions(简单的并查集题目)
- 开源 免费 java CMS - FreeCMS1.9 简历管理
- Sigma.js
- 通信交互总结
- 图片动画
- View位置参数
- EYSegmentViewController的使用
- Android IntentService完全解析 当Service遇到Handler
- java读取文件的路径问题
- 数据结构-1
- A表插入数据其中一个字段是B表的某个字段
- MySQL的保留关键字,使用时尽量避免
- MonoGame教程
- ime-mode:disabled 关闭文本框输入法
- Tomcat工作原理
- 支付宝集成遇到的问题
- 如何在Mac中安装好Ruby环境
- Git学习笔记 (二)
- 生成APNS Service证书的步骤[转]