poj2488--------------深搜(注意字典序)
2013-01-11 20:36
260 查看
刚开始读题的时候不小心,认为只要深搜就ok了,交了之后一直wa。
看了discuss才知道读题不小心,原来是要按字典序顺序(刚开始有注意到那个陌生单词,不知道什么意思,就忽略了……>_<...没文化真可怕啊)。我把遍历节点的两层循环改为外层循环列,内层循环行,之后提交,依旧wa。
自后才想到对每个位置周围的可走的八个位置搜索是有先后顺序的,应该按照列值由小到大的顺序,改了之后ac了。
看了discuss才知道读题不小心,原来是要按字典序顺序(刚开始有注意到那个陌生单词,不知道什么意思,就忽略了……>_<...没文化真可怕啊)。我把遍历节点的两层循环改为外层循环列,内层循环行,之后提交,依旧wa。
自后才想到对每个位置周围的可走的八个位置搜索是有先后顺序的,应该按照列值由小到大的顺序,改了之后ac了。
#include<stdio.h> int a[30][30]; int vis[30][30]; int x[30], y[30]; int tx[10] = {-1, 1, -2, 2, -2, 2, -1, 1}, ty[10] = {-2, -2, -1, -1, 1, 1, 2, 2}; int p, q, tmp; int dfs(int i, int j, int step) { x[step] = i; y[step] = j; vis[i][j] = 1; if(step == p*q) return 1; int px, py; for(int k=0; k<8; k++) { px = i + tx[k]; py = j + ty[k]; if(!vis[px][py] && px>=0 && px<p && py>=0 && py<q) if(dfs(px, py, step+1)) return 1; } vis[i][j] = 0; return 0; } int solve() { for(int k=0; k<30; k++) { for(int l=0; l<30; l++) { vis[k][l] = 0; } } for(int j=0; j<q; j++) { for(int i=0; i<p; i++) { if(dfs(i, j, 1)) { return 1; } } } return 0; } int main() { int n; scanf("%d", &n); for(int t=1; t<=n; t++) { scanf("%d %d", &p, &q); int r = solve(); printf("Scenario #%d:\n", t); if(r) { for(int i=1; i<=p*q; i++) { printf("%c%d", 'A'+y[i], x[i]+1); } } else { printf("impossible"); } printf("\n\n"); } return 0; }
相关文章推荐
- 深搜_Poj_2488(字典序)
- poj 2488 A Knight's Journey 【dfs】【字典序】【刷题计划】
- Poj(2488),按照字典序深搜
- poj2488 回溯 注意字典 边缘的处理思想
- POJ-2488 A Knight's Journey 解题报告(搜索) 马跳遍棋格的字典序问题
- (水)POJ-2488字典序dfs
- poj2488 A Knight's Journey 简单DFS 注意搜索步骤
- poj 2337 欧拉回路按照最小字典序输出+注意为了按最小字典序怎么处理邻接表
- POJ_2488——骑士遍历棋盘,字典序走法
- POJ-2488 A Knight's Journey(需注意搜索顺序的深搜)
- 【POJ】1146 - ID Codes(字符串下一个字典序)
- POJ 2488:A Knight's Journey 深搜入门之走马观花
- POJ 2488 A Knight's Journey
- 【最小路径覆盖+注意】POJ 2594
- K Best POJ - 3111 (二分最大化平均值,注意用G++提交,不然TLE)
- poj 2387 dijkstra(注意判重)
- poj_2488 A Knight's Journey
- poj 2488 深度优先遍历
- POJ 2488-A Knight's Journey(DFS-象棋中的马)
- POJ 2488-A Knight's Journey(DFS)