题目:

标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)

从我做起振
我做起振兴
做起振兴中
起振兴中华

比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。

要求跳过的路线刚好构成“从我做起振兴中华”这句话。

                           

请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。



思路:

深度优先遍历,首先把所有汉字抽象化为数字,每次操作只能向四周的与它距离为1的点移动。所以就相当于遍历,找


代码:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<cstdlib>  
  4. #include<cstring>  
  5. #include<algorithm>  
  6. using namespace std;  
  7.   
  8. int sum=0;  
  9. bool ch[4][5];  
  10. int map[4][5]={{0, 1, 2, 3, 4},    
  11.               {1, 2, 3, 4, 5},    
  12.               {2, 3, 4, 5, 6},    
  13.               {3, 4, 5, 6, 7}};  
  14. int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};                
  15.                 
  16. void dfs(int x,int y)  
  17. {  
  18.     if(map[x][y]==7)sum++;  
  19.     for(int i=0;i<4;i++)  
  20.     {  
  21.         int dx=x+dir[i][0];  
  22.         int dy=y+dir[i][1];  
  23.         if(dx<0||dy<0||dx>=4||dy>=5)continue;  
  24.         else  
  25.         {  
  26.             if(ch[dx][dy]==0&&map[dx][dy]-map[x][y]==1)  
  27.             {  
  28.                 ch[dx][dy]=1;  
  29.                 dfs(dx,dy);  
  30.                 ch[dx][dy]=0;  
  31.             }   
  32.         }  
  33.     }  
  34. }