蓝桥杯危险系数以及深搜笔记

在这里插入图片描述

#include<iostream>
using namespace std;
int n,m,u,v;//站点个数,通路个数,起点,终点
int map[1005][1005]={0};//邻接矩阵
int r[1005]={0};//记录是否走过该点
int num[1005]={0};//记录每个点在所有通路中出现次数
int ans=0;//记录通路条数
int main(){
	void dfs(int x);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		map[u][v]=map[v][u]=1;
	}
	cin>>u>>v;
	r[u]=1;
	dfs(u);
	int res=0;//记录答案
	for(int i=1;i<=n;i++){
		if(num[i]==ans) res++;//如果该点在所有通路中出现的次数和通路出现的次数相等,那么该点一定是关键点
	}
	cout<<res-2;//记录时把起点终点也算进去了,所以要减去2
}

void dfs(int x){
	if(x==v){//如果搜的这个点是终点,则是通路
		ans++;//通路个数加一
		for(int i=1;i<=n;i++){
			if(r[i]) num[i]++;//在这条通路中出现的点次数加一
		} 
		return;
	} 
	for(int i=1;i<=n;i++){
		if(r[i]) continue;//如果是已经走过的,继续循环
		else if(map[x][i]){//(x,i)有路
			r[i]=1;//标记i点已经走过
			dfs(i);//寻找i以后的路
			r[i]=0;//等到尝试完,取消标记这个点
		}
	}
}

顺带复习一下深搜,β胡罗卜素博主的代码写得很好,我这里放上他的代码

#include<iostream>
using namespace std;

int n, m, p, q, min = 999999;
int a[51][51], book[51][51];
void dfs(int x, int y, int step) {//其中的坐标为第x行的第y列,即(x,y),左上角即为(1,1)
 int next[4][2] = {
  {0,1},//向右
  {1,0},//向下
  {0,-1},//向左
  {-1,0}//向上
 };
 int tx, ty, k;
 //判断是否到达目的地
 if (x == p && y == q) {
  if (step < min) {
   min = step;
   return;
  }
 }
 for (k = 0; k <= 3; k++) {
  tx = x + next[k][0];
  ty = y + next[k][1];
  //不能越界
  if (tx<1||ty<1||tx>n||ty>m)
  {
   continue;
  }
  if (a[tx][ty]==0&&book[tx][ty]==0)
  {
   book[tx][ty] = 1;//标记一下,走过了
   dfs(tx, ty, step + 1);
   book[tx][ty] = 0;//等到尝试完,取消标记这个点
  }
 }
 return;
}

int main() {
 int i, j, starX, starY;
 cin >> n >> m;
 for (i = 1; i <= n; i++) {
  for (j = 1; j <= m; j++)
  {
   cin >> a[i][j];//输入地图
  }
 }
 cin >> starX >> starY >> p >> q;//输入起点和终点的行列坐标
 book[starX][starY] = 1;//标记起点已经走过
 dfs(starX, starY, 0);
 cout << min;
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值