DFS不易混乱的敲码思路:
int DFS(int x,int step,int n)
{
//进入DFS的该x状态是满足条件的即程序已经处于该X状态
//如果该x状态即最终要找的状态则结束并输出结果
//该x状态已经没法满足条件了,return
//如果不是之后遍历该x状态之后的所有状态,
//并DFS满足条件的下一种状态
}
王道机试指南第二版,例题9.3 A Knight's Journey
题目大意
将士每天看着相同的黑白方块感到越来越无聊并决定去世界各地旅行。骑士按照"日"
子规则行走。骑士的世界就是他生活的棋盘。骑士生活在比普通8x8棋盘更小的棋盘上,
但研盘的形状仍然是长方形的。你能帮助这位旨险骑士制订旅行计划吗?
找一条能够让骑士遍历棋盘上所有点的路径。骑士可以在任何一块方块上开始或结束
他的旅行。
样例输入:
3
1 1
2 3
4 3
样例输出:
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
实现代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,vis[10][10];
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
bool dfs(int x,int y,int step,string s)
{
if(step==n*m)
{
cout<<s<<endl;
return true;
}
for(int i=0;i<8;++i)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0)
{
vis[xx][yy]=1;
char c='A'+yy;
char r='1'+xx;
if(dfs(xx,yy,step+1,s+c+r))
return true;//△找到满足条件的不再进行之后的深搜△
vis[xx][yy]=0;
}
}
return false;//若前面没有return true则说明没有满足条件的,返回false,不要遗漏了该return!!!
}
int main()
{
int i,j,k;
cin>>t;
for(k=1;k<=t;++k)
{
cin>>n>>m;
memset(vis,0,sizeof(vis));
vis[0][0]=1;
cout<<"Scenario #"<<k<<":"<<endl;
if(!dfs(0,0,1,"A1"))
{
cout<<"impossible"<<endl;
}
cout<<endl;
}
}
1万+

被折叠的 条评论
为什么被折叠?



