这里写自定义目录标题
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;
}在这里插入代码片