P8642 [蓝桥杯 2016 国 AC] 路径之谜

P8642

独立完成。

搜索。

yy 方向射向 xx 轴记为 lineyliney,表示这一列应该射多少次。

xx 射向 yy 轴同理。

主要是这个顺序把一开始绕晕了。

所以先输入的其实是 yy 射向 xx 轴,也就是 lineyliney,然后才是 linexlinex

然后要加一个剪枝,如果当前的答案已经超出了限制,就可以不用继续搜下去了。这样可以大大提高效率。

#include<bits/stdc++.h>
using namespace std;
const int N =3000;
struct node{
	int x,y;
}ans[N][N];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int vis[N][N];
int linex[N],liney[N],lastx[N],lasty[N],n;
bool check(int x,int y){
	return (x>=1&&x<=n&&y>=1&&y<=n&&vis[x][y]==0);
}
bool checkans(){
	for(int i=1;i<=n;i++)	if(lastx[i]!=linex[i])	return false;
	for(int i=1;i<=n;i++)	if(lasty[i]!=liney[i])	return false;
	return true;
}
void Print(int x,int y){
	if(x==1&&y==1){
		cout<<0<<" ";
	}
	else{
		Print(ans[x][y].x,ans[x][y].y);
		cout<<(x-1)*n+y-1<<" ";
	}
}
void dfs(int x,int y){
	if(lastx[x]>linex[x])	return ;
	if(lasty[y]>liney[y])	return ;
	if(x==n&&y==n&&checkans()){
		Print(n,n);
		return ;
	}
	for(int i=0;i<=3;i++){
		int xx=x+dx[i],yy=y+dy[i];
		if(!check(xx,yy))	continue;
		lasty[yy]++,lastx[xx]++;
		ans[xx][yy].x=x,ans[xx][yy].y=y;
		vis[xx][yy]=1;
		dfs(xx,yy);
		lasty[yy]--,lastx[xx]--;
		vis[xx][yy]=0;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>liney[i];
	for(int i=1;i<=n;i++)	cin>>linex[i];
	lastx[1]=1,lasty[1]=1,vis[1][1]=1;
	dfs(1,1);
	cout<<endl;
	return 0;
}
posted @   June_Failure  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示