[蓝桥杯][2016年第七届真题]路径之谜

题目链接:路径之谜



解题思路:搜索每一天能到达右下角点的路径,经过每一个位置时,给它的x、y都加上1的贡献,最后到达右下角时,如果x、y的值等于输入的箭靶的数目则为正确答案

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull; 
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
	inline LL read(){
		LL o=0,f=1;char c=getchar();
		while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
		while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
		return o*f;
	}
}using namespace IO;
//#############以上是自定义技巧(可忽略)########## 
const int N=1e2+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131;
int g[N][N];
int rx[N],ry[N],nx[N],ny[N];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool st[N][N],flag;
vector<int>path;
int n; 
bool check(){
	for(int i=0;i<n;i++){
		if(rx[i]!=nx[i]||ry[i]!=ny[i])return false;
	} 
	return true;
}
void dfs(int x,int y){
	if(flag)return ;//如果已经找到答案就直接退出
	if(x==n-1&&y==n-1&&check()){//到达终点判断是否符合箭靶数量
		flag=1;//符合就打标记找到答案
		for(int i=0;i<path.size();i++){
			cout<<path[i]<<" ";
		}
		cout<<endl;
		return ;		
	}
	for(int i=0;i<4;i++){//向四个方向搜索
		int tx=x+dx[i],ty=y+dy[i];
		if(st[tx][ty])continue;//如果已经来过就跳过
		if(tx<0||tx>=n||ty<0||ty>=n)continue;//如果越界就跳过
		st[tx][ty]=1;//标记来过
		nx[tx]++,ny[ty]++;//并且给该位置的行列加上贡献1
		path.push_back(g[tx][ty]);//把下一个位置加入答案
		dfs(tx,ty);//去到下一个位置搜索
		st[tx][ty]=0;//如果下一个位置不合法的就回溯
		nx[tx]--,ny[ty]--;
		path.pop_back();	
	} 
	
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>ry[i];
	for(int i=0;i<n;i++)cin>>rx[i];
	for(int x=0,i=0;i<n;i++){
		for(int j=0;j<n;j++,x++){
			g[i][j]=x;//给每一个位置放入该点的数
		}
	}
	path.push_back(0);//从左上角出去,放入答案
	st[0][0]=1;//标记已经来过
	nx[0]++;//(0,0)行列贡献+1
	ny[0]++;
	dfs(0,0);
	
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值