房间(room)
题目可以到下载频道上下载:题目
本题题目:
Task 1. 房间(room) 空间限制:256MB 时间限制:1s
Description
有n个房间以及m条双向通道。
你需要找到有多少条从1号房间出发到n号房间路径,使得每个房间都恰好经过了一次。
Input
第一行两个数n、m。
接下来m行,每行两个数x、y,描述一条连接房间x和房间y的通道。
保证每条通道连接两个不同的房间,并且每两个房间至多只有一条通道连接。
Output
一行一个数,表示满足要求的路径条数。
Range
1≤n≤10,0≤m≤n*(n-1)/2
Sample
room.in
5 7
1 2
1 3
3 2
3 4
1 5
5 4
4 2
room.out
2
两条路径分别是:1-2-3-4-5和1-3-2-4-5。
这题是一道搜索题,直接套搜索模板就可以了:
void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意来添加 return; } if(越界或者是不符合法状态) return; for(扩展方式) { if(扩展方式所达到状态合法) { ....//根据题意来添加 标记; dfs(); 修改(剪枝); (还原标记); //是否还原标记根据题意 //如果加上(还原标记)就是 回溯法 } } }代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<vector> #include<list> std::vector< std::list<int> > map1; int limit[100]; int get_ans(int now,int target,int deep) { if(limit[now]==1)return 0; if(deep==target-1)return now==target; int ans = 0;limit[now] = 1; for(std::list<int>::iterator it = map1[now].begin();it!=map1[now].end();it++) ans += get_ans(*it,target,deep+1); limit[now] = 0; return ans; } int main() { freopen("room.in","r",stdin); freopen("room.out","w",stdout); int n,m; std::cin>>n>>m; map1.resize(n+1); for(int i = 0;i<m;i++) { int a,b; std::cin>>a>>b; map1[a].push_back(b); map1[b].push_back(a); } std::cout<<get_ans(1,n,0); fclose(stdin); fclose(stdout); return 0; }其中有用到list的迭代器,如果你不知道这是什么,请访问:点击打开链接
随时随刻,当你想要颓废的时候,想想之前为何而来,当你想要放弃的时候,想想之前你为何坐在这里