2021-03-17

这里写自定义目录标题


2016蓝桥杯路径之谜

#include<iostream>

using namespace std;
int used[100][100]={0};
int move1[4]={0,1,0,-1};
int move2[4]={1,0,-1,0}; 
int n;
int bei1[100],xi1[100];
int bei[100],xi[100];
int line[500]={0};
int len=0;

int cnum(int i,int j){
	return i*n+j;//由行列号返回编号 
}

int isleg(int i,int j){//判断位置是否合法 
	if(i>=0&&j>=0&&i<n&&j<n)
		return 1;
	else
		return 0;
}

void mdfs(int i,int j){
	if(i==n-1&&j==n-1){ 
		//cout<<"sucess"<<endl;
		bool t=true;
		for(int i=0;i<n;i++){
			if(bei1[i]!=bei[i]||xi1[i]!=xi[i])
				t=false;
		}//如果走到终点但是不符合条件 
	if(t){
			//cout<<"sucess"<<endl;
		for(int i=0;i<=len;i++)
			cout<<line[i]<<" ";//符合条件就输出 
			cout<<endl;
			return;
		}
	else
		return;
	}
	
	
	for(int k=0;k<4;k++){
		if(!isleg(i+move1[k],j+move2[k]))//如果下一步位置不合法,跳过 
			continue;
		if(!used[i+move1[k]][j+move2[k]])
			used[i+move1[k]][j+move2[k]]=1;
		else
			continue;
		//cout<<i+move1[k]<<" "<<j+move2[k]<<endl;
		bei1[j+move2[k]]++;
		xi1[i+move1[k]]++;
		len++;
		line[len]=cnum(i+move1[k],j+move2[k]);//计算编号 
		mdfs(i+move1[k],j+move2[k]);
		used[i+move1[k]][j+move2[k]]=0;
		len--;
		bei1[j+move2[k]]--;
		xi1[i+move1[k]]--;
	}
	return;
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>bei[i];
	for(int i=0;i<n;i++)
		cin>>xi[i];
	used[0][0]=1;
	bei1[0]++;
	xi1[0]++;
	mdfs(0,0);
	return 0;
}在这里插入代码片
上一篇:LeetCode刷题——回溯算法


下一篇:jvm的那些设置参数你都知道吗