题目可以到下载频道上下载:题目
本题题目:
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的迭代器,如果你不知道这是什么,请访问:
点击打开链接