1. 程式人生 > >洛谷P1556 幸福的路

洛谷P1556 幸福的路

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 幸福的路