UVA 208 Firetruck
题目大意:输入火焰所在的地点数字和哪些地点相连(数字不超过21),求从1通往火焰一共几条路
解题思路:回溯找路,用剪枝优化,访问点时确认这个点能通往火焰所在地点
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int range[25][25];
int range2[25][25];
int flag[25];
int n;
int all;
int u = 0;
int num[1000];
void dfs(int a) {
if(a == n) {
for(int i = 0; i < u; i++) {
if(i)
printf(" ");
printf("%d", num[i]);
}
printf("\n");
all++;
return;
}
for(int i = 1; i <= 21; i++) {
if(range[a][i] && range2[i][n] && !flag[i]) {
range[a][i] = 0;
range[i][a] = 0;
num[u++] = i;
flag[i] = 1;
dfs(i);
u--;
flag[i] = 0;
range[a][i] = 1;
range[i][a] = 1;
}
}
}
int main() {
int p = 0;
while(scanf("%d", &n) != EOF) {
p++;
memset(range, 0, sizeof(range));
memset(range2, 0, sizeof(range2));
memset(flag, 0, sizeof(flag));
int x, y;
all = 0;
while(cin >> x >> y && x + y) {
range[x][y] = 1;
range[y][x] = 1;
range2[x][y] = 1;
range2[y][x] = 1;
}
for(int k = 1; k <= 21; k++) {
for(int i = 1; i <= 21; i++)
for(int j = 1; j <= 21; j++) {
if(range2[i][k] && range2[k][j])
range2[i][j] = 1;
}
range2[k][k] = 1;
}
printf("CASE %d:\n", p);
u = 1;
if(range2[1][n]) {
flag[1] = 1;
num[0] = 1;
dfs(1);
}
printf("There are %d routes from the firestation to streetcorner %d.\n", all, n);
}
return 0;
}