洛谷 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
思路:搜索,主要是读懂题目吧!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans,x[11],y[11],vis[11];
void dfs(int px,int py,int num,int pre){
    if(num==n){
        if(px>0&&py==0&&pre!=4){ans++;return ;}
        if(px<0&&py==0&&pre!=3){ans++;return ;}
        if(px==0&&py>0&&pre!=1){ans++;return ;}
        if(px==0&&py<0&&pre!=2){ans++;return ;}
    }
    for(int i=1;i<=n;i++){
        if(x[i]==px&&y[i]<py&&!vis[i]&&pre!=1){
            vis[i]=1;
            dfs(x[i],y[i],num+1,1);
            vis[i]=0;
        }
        if(x[i]==px&&y[i]>py&&!vis[i]&&pre!=2){
            vis[i]=1;
            dfs(x[i],y[i],num+1,2);
            vis[i]=0;
        }
        if(x[i]>px&&y[i]==py&&!vis[i]&&pre!=3){
            vis[i]=1;
            dfs(x[i],y[i],num+1,3);
            vis[i]=0;
        }
        if(x[i]<px&&y[i]==py&&!vis[i]&&pre!=4){
            vis[i]=1;
            dfs(x[i],y[i],num+1,4);
            vis[i]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&x[i],&y[i]);
    dfs(0,0,0,0);
    cout<<ans;
}

 

 
posted @ 2017-09-19 15:05  一蓑烟雨任生平  阅读(296)  评论(0编辑  收藏  举报