Problem Description
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华.
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数。
注意:不要提交解答过程,或其它辅助说明类的内容。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华.
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数。
注意:不要提交解答过程,或其它辅助说明类的内容。
Input
无
Output
一个整数
#include <iostream>
using namespace std;
int sum=0;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int used[5][5]={0};
int a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{4,5,6,7,8}};
bool judge(int x,int y){
if(x>=0 && x<5 &&y>=0 && y<5 && !used[x][y])
return true;
return false;
}
void dfs(int x,int y,int n){
int i,j;
if(n>8)
return;
if(x>=5 || y>=5)
return;
if(n==8){
sum++;
return;
}
for(i=0;i<4;i++){
int n1=x+dir[i][0];
int n2=y+dir[i][1];
if(judge(n1,n2)){
if(a[n1][n2]==n+1){
used[n1][n2]=1;
dfs(n1,n2,n+1);
used[n1][n2]=0;
}
}
}
}
int main(){
int i;
dfs(0,0,1);
used[0][0]=1;
cout<<sum;
return 0;
}
答案:35