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)。如果湖泊Li和Lj之间有水路相连,则青蛙Fi和Fj互称为邻居。现在已知每只青蛙的邻居数目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 }