• poj 1659 Frogs' Neighborhood (DFS)


    http://poj.org/problem?id=1659

    Frogs' Neighborhood
    Time Limit: 5000MS   Memory Limit: 10000K
    Total Submissions: 6050   Accepted: 2623   Special Judge

    Description

    未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i  N)。如果湖泊LiLj之间有水路相连,则青蛙FiFj互称为邻居。现在已知每只青蛙的邻居数目x1, x2, ..., xn,请你给出每两个湖泊之间的相连关系。

    Input

    第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1, x2,..., xn(0 ≤ xi  N)。

    Output

    对输入的每组测试数据,如果不存在可能的相连关系,输出"NO"。否则输出"YES",并用N×N的矩阵表示湖泊间的相邻关系,即如果湖泊i与湖泊j之间有水路相连,则第i行的第j个数字为1,否则为0。每两个数字之间输出一个空格。如果存在多种可能,只需给出一种符合条件的情形。相邻两组测试数据之间输出一个空行。

    Sample Input

    3
    7
    4 3 1 5 4 2 1 
    6
    4 3 1 4 2 0 
    6
    2 3 1 1 2 1 
    

    Sample Output

    YES
    0 1 0 1 1 0 1 
    1 0 0 1 1 0 0 
    0 0 0 1 0 0 0 
    1 1 1 0 1 1 0 
    1 1 0 1 0 1 0 
    0 0 0 1 1 0 0 
    1 0 0 0 0 0 0 
    
    NO
    
    YES
    0 1 0 0 1 0 
    1 0 0 1 1 0 
    0 0 0 0 0 1 
    0 1 0 0 0 0 
    1 1 0 0 0 0 
    0 0 1 0 0 0 
    

    Source

     
    【题解】:直接DFS搜索  16ms 过
    【code】:
     1 /**
     2 Satus:Accepted      Memory:676K
     3 Time:16MS     Language:G++
     4 Code Lenght:1774B  Author:cj
     5 */
     6 #include<iostream>
     7 #include<stdio.h>
     8 #include<algorithm>
     9 #include<vector>
    10 #include<queue>
    11 #include<string.h>
    12 
    13 #define N  11
    14 using namespace std;
    15 
    16 //map保存最终结果  vi表示已知i的邻居数  cnti表示i目前的邻居数目
    17 int map[N][N],v[N],cnt[N],n,flag;  //flag 标记 YES 或 NO
    18 
    19 void dfs(int id)  //对第id只青蛙进行搜索
    20 {
    21     int i,j;
    22     if(flag) return;  //找到了就直接退出 
    23     if(id>n) //n只青蛙全部搜索完,表示已经出现结果了
    24     {
    25         flag =1; //标记结果出现
    26         puts("YES"); 
    27         for(i=1;i<=n;i++)
    28         {
    29             for(j=1;j<=n;j++)
    30             {
    31                 if(j==1)    printf("%d",map[i][j]|map[j][i]);  //用或运算将图的另一半对称输出
    32                 else    printf(" %d",map[i][j]|map[j][i]);  //用或运算将图的另一半对称输出
    33             }
    34             putchar(10); //换行
    35         }
    36         return ;
    37     }
    38     if(cnt[id]==v[id])  //第id只青蛙已经搜索到满足条件的状态
    39     {
    40         dfs(id+1);  //开始下一只青蛙的搜索
    41         return;
    42     }
    43     for(i=1;i<=n;i++)  //只对图的右上半部分进行操作,另一半对称输出就行了
    44     {
    45         if(i<id)  //对y轴方向操作
    46         {
    47             if(!map[i][id]&&cnt[id]<v[id]&&cnt[i]<v[i])  //满足搜索条件记得加cnt[i]<v[i]
    48             {
    49                 map[i][id] = 1;
    50                 cnt[id]++;
    51                 cnt[i]++;  //id与i两只青蛙邻居关系是相互的,所以要同时++
    52                 dfs(id);
    53                 cnt[i]--;
    54                 cnt[id]--;
    55                 map[i][id] = 0;
    56             }
    57         }
    58         else if(i>id)  //对x轴方向操作
    59         {
    60             if(!map[id][i]&&cnt[id]<v[id]&&cnt[i]<v[i]) 
    61             {
    62                 map[id][i] = 1;
    63                 cnt[id]++;
    64                 cnt[i]++;
    65                 dfs(id);
    66                 cnt[i]--;
    67                 cnt[id]--;
    68                 map[id][i] = 0;
    69             }
    70         }
    71     }
    72 }
    73 
    74 int main()
    75 {
    76     int t,cas=0;
    77     scanf("%d",&t);
    78     while(t--)
    79     {
    80         scanf("%d",&n);
    81         int i;
    82         for(i=1;i<=n;i++)
    83         {
    84             scanf("%d",v+i);
    85         }
    86         memset(map,0,sizeof(map));
    87         memset(cnt,0,sizeof(cnt));
    88         flag = 0;
    89         if(cas++)   putchar(10);
    90         dfs(1);  //从第一个青蛙开始搜索
    91         if(!flag)   puts("NO");
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    基于mAppWidget实现手绘地图--索引&DEMO
    C语言数据结构----栈的定义及实现
    libvirt命令行文档
    清理系统方法
    Linux 经典电子书共享下载
    使用数组实现队列----《数据结构与算法分析---C语言描述》
    清理系统垃圾
    epoll的内部实现 & 百万级别句柄监听 & lt和et模式非常好的解释
    进程、线程、socket套接字-资源大小 & 切换代价
    网络编程学习-面向工资编程
  • 原文地址:https://www.cnblogs.com/crazyapple/p/3243803.html
Copyright © 2020-2023  润新知