有一个7X7的方格。方格左上角顶点坐标为(0,0),右下角坐标为(7,7)。
求满足下列条件的路径条数:
1、起点和终点都是(0,0)
2、路径不自交
3、路径长度不大于12
4、对于每一个顶点,有上下左右四个方向可以走,但是不能越界。
例如,图中路线,左上角顶点(0,0),路线长度为10
答案:206
分析:dfs,路径一定大于3,剪枝路径>12的,以及x和y坐标和大于6时,
一定不满足,结束搜索。
#include<bits/stdc++.h>
#include<iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
int vis[10][10]={0};
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int ans = 0;
void dfs(int x,int y,int cnt)
{
if(cnt > 12)
return;
if(x == 0&&y == 0&& cnt > 3&& cnt <= 12){
ans++;
return;
}
for(int i = 0; i <4 ;i++){
int nx = x+dx[i];
int ny = y+dy[i];
if(vis[nx][ny] == 1||nx<0||nx>7||ny<0||ny>7)
continue;
vis[nx][ny] = 1;
dfs(nx,ny,cnt+1);
vis[nx][ny] = 0;
}
}
int main ()
{
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
#include<iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
int vis[10][10]={0};
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int ans = 0;
void dfs(int x,int y,int cnt)
{
if(cnt > 12)
return;
for(int i = 0; i <4 ;i++){
int nx = x+dx[i];
int ny = y+dy[i];
if(nx == 0&&ny == 0&& cnt>1&& cnt <= 12){
ans++;
}
if(vis[nx][ny] == 1||nx<0||nx>7||ny<0||ny>7)
continue;
vis[nx][ny] = 1;
dfs(nx,ny,cnt+1);
vis[nx][ny] = 0;
}
}
int main ()
{
vis[0][0]=1;
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}