POJ 2488 -- A Knight's Journey(骑士游历)
2024-09-02 01:41:40
POJ 2488 -- A Knight's Journey(骑士游历)
题意:
给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。
经典的“骑士游历”问题
输入:第一行,整数n,接下来是n行,每一行为p和q,p为行数,q为列数,p用1...p编号,q用A...Q编号
马的走法:每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走"日"字)。可以越子,没有中国象棋中的"蹩马腿"限制。
解题思路:
dfs
#include<iostream>
#include<cstring>
using namespace std;
int r,c;///行r,列c const int dr[] = {-, ,-, ,-,,-,};
const int dc[] = {-,-,-,-, ,, ,};
bool chess[]['Z'+]; struct square{
int row;
char col;
}; bool inside(int x,int y)
{
return x>= && x<=r && y>='A' && y<='A'+c-;
} bool dfs(square *way,int i,int j,int step)
{
chess[i][j]=true;
way[step].row=i;
way[step].col=j;
if(step==r*c)
return true; for(int k=;k<;k++) //骑士从当前位置尝试跳到其他位置
{
int ii,jj;
ii = i+dr[k];jj = j+dc[k];
if(!chess[ii][jj] && inside(ii,jj))
if(dfs(way,ii,jj,step+))
return true;
} chess[i][j]=false; //能执行到这步,说明前面跳的8步都不符合要求
return false; //即当前位置是错误位置,擦除记录返回上一步
} int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>r>>c;
bool flag = false;
memset(chess,false,sizeof(chess));
square *way = new square[r*c+];
for(int i='A';i<='A'+c-;i++)
{
for(int j=;j<=r;j++)
{
flag = dfs(way,j,i,);
if(flag)
break;
}
if(flag)
break;
} ///打印解
cout<<"Scenario #"<<i<<":"<<endl;
if(flag)
{
for(int k=;k<=r*c;k++)
cout<<way[k].col<<way[k].row;
cout<<endl<<endl;
}else{
cout<<"impossible"<<endl<<endl;
} }
return ;
}
最新文章
- [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数
- 论SOA架构的几种主要开发方式
- oracle查询小结
- java注释指导手册
- poj 2109 Power of Cryptography
- hdu 4608 I-number 大整数
- RecycleView 滑动到底部,加载更多
- Hadoop 实现对Value倒序排序
- 2.6. Statistical Models, Supervised Learning and Function Approximation
- JQuery中一个简单的表单验证的实例
- 机器学习技法:13 Deep Learning
- 解决CentOS出现";No package redis available";提示问题
- 使用 JavaScript 将 XML 转成 JSON
- Javascript中变量提升的问题(五)
- JDK 之 Java Bean 内省机制
- jquery获取浏览器各种高宽
- NYOJ 16 矩形嵌套(经典DP)
- Jenkins+Ant/maven+Svn实现自动化部署,编译,运行,测试结果自动邮件通知
- Linux-- su和sudo 切换用户
- 详说 CSS 清除浮动