洛谷P1556 幸福的路

P1556 幸福的路

题目描述

每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波。

每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发。为了使路径更有趣,John决定只沿着平行于坐标轴的方向行走,这样只能沿着东西南北方向运动。而且只有到达某头牛的坐标后John才会改变行走的方向(当然,如果有必要,John也会穿过某头牛的坐标而不改变行走的方向。)

如果John改变行走的方向,他会原地转90°或者180°。John的路径必须保证检查完所有牛后返回原点。

John可以穿过某头牛的坐标而不改变方向任意次,请计算出有多少条路径满足John能检查完N头牛,在每头牛的坐标处恰好改变一次方向。同一条路径从不同方向经过要计算两次。

输入输出格式

输入格式:

第一行,整数N。

第2行到第N+1行,第i+1行是两个用空格隔开的整数x和y,表示第i头牛的坐标(-1000 ≤x, y ≤1000)

输出格式:

一行个整数,表示路径的量如果没有满足要求则输出 0。

输入输出样例

输入样例#1:
4
0 1
2 1
2 0
2 -5
输出样例#1:
2
/*
    没什么难点,就几个细节需要注意一下
    一个是dfs时需要记录下上一次改变的方向
    第二个是千万不要忘了最后要返回(0,0)
*/
#include<iostream>
#include<cstdio>
#define maxn 11
using namespace std;
int n,ans;
bool vis[maxn];
struct node{
    int x,y;
}a[maxn];
void dfs(int x,int y,int cnt,int pre){//pre:1上,2下,3左,4右 
    if(cnt==n){
        if(x==0&&y>0&&pre!=2){ans++;return;}
        if(x==0&&y<0&&pre!=1){ans++;return;}
        if(y==0&&x>0&&pre!=3){ans++;return;}
        if(y==0&&x<0&&pre!=4){ans++;return;}
    }
    for(int i=1;i<=n;i++){
        if(vis[i])continue;
        if(a[i].x>x&&a[i].y==y&&pre!=4){//正右方 
            vis[i]=1;
            dfs(a[i].x,a[i].y,cnt+1,4);
            vis[i]=0;
        }
        if(a[i].x<x&&a[i].y==y&&pre!=3){//正左方 
            vis[i]=1;
            dfs(a[i].x,a[i].y,cnt+1,3);
            vis[i]=0;
        }
        if(a[i].x==x&&a[i].y<y&&pre!=2){//正下方 
            vis[i]=1;
            dfs(a[i].x,a[i].y,cnt+1,2);
            vis[i]=0;
        }
        if(a[i].x==x&&a[i].y>y&&pre!=1){//正上方 
            vis[i]=1;
            dfs(a[i].x,a[i].y,cnt+1,1);
            vis[i]=0;
        }
    }
}
int main(){
    //freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    dfs(0,0,0,0);
    cout<<ans;
}
原文地址:https://www.cnblogs.com/thmyl/p/7517445.html