洛谷 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; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。