zoukankan      html  css  js  c++  java
  • 洛谷P1556 幸福的路

    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;
    }
  • 相关阅读:
    Comet OJ 夏季欢乐赛 篮球校赛
    USACO Tractor
    Comet OJ 夏季欢乐赛 Gree的心房
    USACO Hide and Seek
    Comet OJ 夏季欢乐赛 分配学号
    php如何上传txt文件,并且读取txt文件
    插入多行数据的时候,一个insert插入多行
    连接优化查询,按条件查询的时候,如何优化查询的时间
    如何将txt的多行记录直接导入到mysql数据库
    如何在自己的网页上插入一个超链接,发起临时qq会话
  • 原文地址:https://www.cnblogs.com/thmyl/p/7517445.html
Copyright © 2011-2022 走看看