uva208 Firetruck
来源:互联网 发布:python 命名实体 编辑:程序博客网 时间:2024/05/16 11:48
原题链接
解题思路:先用bfs判断可不可到达,能够到达再暴力搜索就OK了。
因为数据量很小,我使用的是邻接矩阵,这些可以保证字典序,如果使用邻接表,还要对每个vector节点进行排序。
#include<cstdio>#include<algorithm>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn=25;int v[maxn][maxn];int goal,tot=0;int ans[maxn],vis[maxn];inline void print(int cur){ printf("%d",ans[0]); for(int i=1;i<=cur;i++){ printf(" %d",ans[i]); } printf("\n");}void dfs(int cur){ if(ans[cur]==goal){ tot++; print(cur); return; } for(int i=2;i<=20;i++){ if(!vis[i]&&v[ans[cur]][i]){ vis[i]=1; ans[cur+1]=i; dfs(cur+1); vis[i]=0; } }}bool is_access(){ queue<int>q; q.push(1); vis[1]=1; while(!q.empty()){ int temp=q.front(); q.pop(); if(temp==goal) return true; for(int i=2;i<=20;i++){ if(!vis[i]&&v[temp][i]){ q.push(i); vis[i]=1; } } } return false;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int from,to,kase=0; while(scanf("%d",&goal)==1){ tot=0; memset(vis,0,sizeof(vis)); memset(v,0,sizeof(v)); while(true){ scanf("%d%d",&from,&to); if(!from) break; v[from][to]=v[to][from]=1; } printf("CASE %d:\n",++kase); if(is_access()){ memset(vis,0,sizeof(vis)); ans[0]=1; vis[1]=1; dfs(0); } printf("There are %d routes from the firestation to streetcorner %d.\n",tot,goal); } return 0;}
0 0
- uva208 - Firetruck
- uva208 - Firetruck
- UVA208 Firetruck
- uva208 Firetruck
- [回溯&&剪枝]Firetruck UVA208
- Uva208——Firetruck
- UVA208 Firetruck 回溯
- UVA208 Firetruck 【搜索】
- (未)uva208 - Firetruck
- uva208 -Firetruck (双向搜索进行剪枝)
- Uva208 Firetruck【dfs】【习题7-1】
- UVa208
- UVA208
- uva208
- uva208
- UVA208
- UVA208
- uva208
- 元素逆置
- 关于数组中重复元素的操作
- 删除数组中特定的元素或者某一范围的元素
- 题目1064:反序数
- 题目1074:对称平方数
- uva208 Firetruck
- 题目1124:Digital Roots (方法超简单)
- 题目1118:数制转换
- 题目1026:又一版 A+B
- 题目1138:进制转换
- 2.1删除不带头结点的单链表L中值为x的结点
- 2.2删除带头结点的L中所有值为x的结点
- 求闰年
- 2.3从尾到头输出单链表每个结点的值