深度优先搜索DFS总结

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;
	}
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值