【回溯】NOIP2003马拦卒过河

水题一道,直接暴力搜索即可。

#include<iostream>
#include<string.h>
using namespace std;
void dfs(int x,int y);

const int dir_x[]={1,1,2,2,-1,-1,-2,-2};
const int dir_y[]={2,-2,1,-1,2,-2,1,-1};
bool avail[40][40],checked[40][40];
int des_x,des_y,counter;

int main(){
	
	int tmpx,tmpy,horse_x,horse_y;
	
	memset(avail,true,sizeof(avail));
	memset(checked,false,sizeof(checked));
	cin>>des_x>>des_y>>horse_x>>horse_y;	
	avail[horse_x][horse_y]=false;
	
	for(int i=0;i<8;i++){
		tmpx=horse_x+dir_x[i];
		tmpy=horse_y+dir_y[i];
		if(tmpx<0||tmpy<0)
			continue;
		avail[tmpx][tmpy]=false;
	}
	counter=0;
	dfs(0,0);
	cout<<counter<<endl;
	//system("pause");
	return 0;
}

void dfs(int x,int y){
	if(x==des_x&&y==des_y){
		counter++;
		return;
	}
	if(x>des_x||y>des_y)
		return;
	if(checked[x+1][y]==false&&avail[x+1][y]==true){
		checked[x+1][y]=true;
		dfs(x+1,y);
		checked[x+1][y]=false;
	}
	
	if(checked[x][y+1]==false&&avail[x][y+1]==true){
		checked[x][y+1]=true;
		dfs(x,y+1);
		checked[x][y+1]=false;
	}
	return;
}


你可能感兴趣的:(【回溯】NOIP2003马拦卒过河)