POJ 2488 A Knight's Journey解题报告(回溯算法)
题目来源:POJ 2488 A Knight's Journey
http://acm.pku.edu.cn/JudgeOnline/problem?id=2488
解法类型:回溯算法
作者:刘亚宁
题目大意:给出一个棋盘的大小,判断马能否不重复的走过所有格,并记录下其中一种走法。
题目思路:经典回溯,特殊性不是很强。特殊点是需记录走法,方法是,如果走成功则记录该步的走法,否则不记录。
提交情况:无错误提交记录。
注意:代码中还有许多不精简之处,望各位指教改正。
源程序:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int map[30][30],c,r,num;
string ans;
int dfs(int i, int j)
{
if(map[i][j]) return 0;
num++;
ans+=i;
ans+=j;
map[i][j]=1;
if(num==r*c) return 1;
if(i-2>=1&&j-1>=1&&dfs(i-2,j-1)) return 1;
else if(i-2>=1&&j+1<=c&&dfs(i-2,j+1)) return 1;
else if(i-1>=1&&j-2>=1&&dfs(i-1,j-2)) return 1;
else if(i-1>=1&&j+2<=c&&dfs(i-1,j+2)) return 1;
else if(i+1<=r&&j-2>=1&&dfs(i+1,j-2)) return 1;
else if(i+1<=r&&j+2<=c&&dfs(i+1,j+2)) return 1;
else if(i+2<=r&&j-1>=1&&dfs(i+2,j-1)) return 1;
else if(i+2<=r&&j+1<=c&&dfs(i+2,j+1)) return 1;
ans.resize(ans.size()-2);
map[i][j]=0;
num--;
return 0;
}
int main()
{
long caseNum,i;
cin>>caseNum;
for(i=1;i<=caseNum;i++)
{
cout<<"Scenario #"<<i<<":"<<endl;
num=0;
memset(map,0,sizeof(map));
ans="";
cin>>c>>r;
if(dfs(1,1))
{
for(int j=0;j<ans.size();j++)
{
if(j%2) ans[j]+='0';
else ans[j]+='A'-1;
}
cout<<ans<<endl<<endl;
}
else cout<<"impossible"<<endl<<endl;
}
return 0;
}
posted on 2010-03-05 10:14 liugoodness 阅读(944) 评论(0) 编辑 收藏 举报
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述