P1605 迷宫

#include<bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,res;//起点(sx,sy) 终点(fx,fy),总方案数res 
int mp[15][15],v[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool st[15][15];

void dfs(int x,int y){
	if(x==fx&&y==fy){//一旦走到终点,表面当前的走法可以走到终点,那么合法的方案数+1,并回溯到上一步(看看还有没有其他合法的方案) 
		res++;//方案数增加+1 
		return;
	}
	for(int i=0;i<4;i++){//遍历当前(x,y)点可以达到的合法位置 
		int tx=x+v[i][0],ty=y+v[i][1];
		//检查tx,ty是否在合法区间,之前没有走过,并且不是石头 
		if(tx>=1&&tx<=n&&ty>=1&&ty<=m && st[tx][ty]==0 && mp[tx][ty]==0){
			st[tx][ty]=1;//标记走过 
			dfs(tx,ty);
			st[tx][ty]=0;//回溯后,尝试其他的走法(去往其他的tx,ty),那么先把当前的tx,ty重新标记没走过 
		}
	}
}

int main()
{
	cin>>n>>m>>t;
	//输入起点 终点 
	cin>>sx>>sy>>fx>>fy;
	//表示有t个石头 
	while(t--){
		int x,y;
		cin>>x>>y;
		mp[x][y]=1;//mp[x][y]=1,表示坐标xy处有石头 
	}
	st[sx][sy]=1;//标记起点已经走过 
	dfs(sx,sy);//对起点进行深度优先搜索 
	cout<<res<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值