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 }

 

posted @ 2013-08-07 18:26  crazy_apple  阅读(233)  评论(0编辑  收藏  举报