POJ 2488
来源:互联网 发布:moonlight软件下载 编辑:程序博客网 时间:2024/06/01 07:46
题目链接:http://poj.org/problem?id=2488
——————————————————————————————————————
题目描述:
象棋,马走日字,问能否不重复的走完所有格子,不限起点终点。
输出字典序最小。
——————————————————————————————————————
题目思路:
直接搜索。dfs。
——————————————————————————————————————
题目细节:
1、要求字典序最小,这地方有点问题。对于每一步棋,都是字母排在前面,数字排在后面,所以我们优先选字母小的,字母相同时选数字小的就可以了。这里一开始没有注意到,wa了。
2、关于为什么可以搜索(?????)
3、事先可枚举好能够走的方式:
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
——————————————————————————————————————
源代码:
#include <iostream>#include<stdio.h>#include<stdlib.h>#include<cstring>using namespace std;int flag[27][27];int path[27];int q = 0,p = 0;int dfs(int cur,int i,int j){ if(cur == q*p+1) return 1; if(i>2 && j>1) { if(flag[i-2][j-1] == 0) { flag[i-2][j-1] = 1; path[cur] = (i-2)*100+j-1; if(dfs(cur+1,i-2,j-1)) return 1; flag[i-2][j-1] = 0; } } if(i>2 && j<=p-1) { if(flag[i-2][j+1] == 0) { flag[i-2][j+1] = 1; path[cur] = (i-2)*100+j+1; if(dfs(cur+1,i-2,j+1)) return 1; flag[i-2][j+1] = 0; } } if(i>1 && j>2) { if(flag[i-1][j-2] == 0) { flag[i-1][j-2] = 1; path[cur] = (i-1)*100+j-2; if(dfs(cur+1,i-1,j-2)) return 1; flag[i-1][j-2] = 0; } } if(i>1 && j<=p-2) { if(flag[i-1][j+2] == 0) { flag[i-1][j+2] = 1; path[cur] = (i-1)*100+j+2; if(dfs(cur+1,i-1,j+2)) return 1; flag[i-1][j+2] = 0; } } if(i<=q-1 && j>2) { if(flag[i+1][j-2] == 0) { flag[i+1][j-2] = 1; path[cur] = (i+1)*100+j-2; if(dfs(cur+1,i+1,j-2)) return 1; flag[i+1][j-2] = 0; } } if(i<=q-1 && j<=p-2) { if(flag[i+1][j+2] == 0) { flag[i+1][j+2] = 1; path[cur] = (i+1)*100+j+2; if(dfs(cur+1,i+1,j+2)) return 1; flag[i+1][j+2] = 0; } } if(i<=q-2 && j>1) { if(flag[i+2][j-1] == 0) { flag[i+2][j-1] = 1; path[cur] = (i+2)*100+j-1; if(dfs(cur+1,i+2,j-1)) return 1; flag[i+2][j-1] = 0; } } if(i<=q-2 && j<=p-1) { if(flag[i+2][j+1] == 0) { flag[i+2][j+1] = 1; path[cur] = (i+2)*100+j+1; if(dfs(cur+1,i+2,j+1)) return 1; flag[i+2][j+1] = 0; } } return 0;}int main(){ int t = 0; int k = 0,j = 0,i = 0; int f = 0; scanf("%d",&t); for(k = 1;k<=t;k++) { memset(flag,0,sizeof(flag)); f = 0; scanf("%d%d",&p,&q); for(i = 1;i<=q;i++) { for(j = 1;j<=p;j++) { path[1] = j+i*100; flag[i][j] = 1; if(dfs(2,i,j)) { f = 1; break; } flag[i][j] = 0; } if(f == 1) break; } printf("Scenario #%d:\n",k); if(f == 0) printf("impossible\n"); else { for(i = 1;i<=q*p;i++) printf("%c%d",path[i]/100+'A'-1,path[i]%100); printf("\n"); } //if(k != t) printf("\n"); } return 0;}
- POJ 2488
- POJ 2488
- POJ 2488
- poj 2488
- poj 2488
- POJ 2488
- poj 2488
- poj 2488
- POJ 2488
- poj 2488
- poj.2488
- POJ 2488
- POJ 2488
- poj-2488
- poj 2488
- poj 2488
- POJ 2488
- POJ 2488
- linux下安装swftools和openOffice
- Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程
- Android GPS 定位的实现
- hibernate联合主键用法
- hdu2079-选课时间
- POJ 2488
- 天天记录 - Eclipse Git插件Egit简单使用
- S5PV210 WinCE6.0 镜像烧写流程分析
- android文件搜索器
- 使用java.util.zip压缩、解压文件
- 0.0、回来了
- 新闻发布系统总结
- 【C++ Primer 学习笔记】chapter8 标准IO库
- linux ls -i 查出文件的节点 touch 'a b c'