洛谷P1556 幸福的路
阿新 • • 發佈:2017-09-13
pre freopen define 輸出格式 註意 i+1 mes 檢查 所有
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; }
洛谷P1556 幸福的路