题目描述
每天,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; }