题面
振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
题目分析
我们可以先按照题面将:
从我做起振
我做起振兴
做起振兴中
起振兴中华
录入数组中,即:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
由此便可以得到向前递进的条件了:当前的等于上一个+1
并且本题是不需要vis(状态数组)的
大体框架:
void search(int x,int y,int last)
{
if (走到底了)
{
总和++;
return;
}
// if (a[x][y] == -1) return;
for (int i = 1; i <= 2; i++) //向两个方向找
{
if (符合越界的条件) continue; //越界了,跳过
if (同如题意)
向前一步搜索;
}
}*强调内容*
代码
#include <bits/stdc++.h>
using namespace std;
int dx[3]={0,0,1}; //介值
int dy[3]={0,1,0};
int a[7][8],ans;
void search(int x,int y,int last) //x,y是坐标,last是上一个的值
{
if (last == 8) //走到底了
{
ans++; //累和
return; //回溯到上一步
}
// if (a[x][y] == -1) return;
for (int i = 1; i <= 2; i++)
{
if (dx[i]+x < 0 || dy[i]+y < 0 || dx[i]+x > 4 || dy[i]+y > 5) continue; //越界了,就跳过
if (a[x+dx[i]][y+dy[i]] == last+1) //如果向下或右的移到的数合法
search(x+dx[i],y+dy[i],last+1); //进一步找
}
}
int main()
{
for(int i = 1; i <= 4; i++) //模拟出图来
for(int j = 0; j < 5; j++)
a[i][j+1] = i + j;
search(1,1,1); //开始搜索
cout<<ans; //输出
return 0; //完美的结束程序
}
**蒟蒻新星c_uizrp_dzjopkl原创**