洛谷-算法1-7-搜索3

P1605 迷宫

题目描述

给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

输入格式

第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。

第二行为四个正整数 SX,SY,FX,FY。SX,SY 代表起点坐标,FX,FY 代表终点坐标。

接下来 T 行,每行两个正整数,表示障碍点的坐标。

输出格式

输出从起点坐标到终点坐标的方案总数。

输入输出样例

输入 #1复制

复制代码
2 2 1
1 1 2 2
1 2

输出 #1复制

复制代码
1

说明/提示

对于 100% 的数据,1≤N,M≤5,1≤T≤10,1≤SX,FX≤N,1≤SY,FY≤M。

实现代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m,t,sum;
int sx,sy,fx,fy;
int a[10][10];
bool ac[10][10];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};


void dfs(int sx,int sy){
	if(sx==fx&&sy==fy){
		sum++;
		return ;
	}
	for(int i=0;i<=3;i++){
		if(!ac[sx+dx[i]][sy+dy[i]]&&a[sx+dx[i]][sy+dy[i]]==1){
			ac[sx][sy]=1;
			dfs(sx+dx[i],sy+dy[i]);
			ac[sx+dx[i]][sy+dy[i]]=0;
		}
	}
	return ;
}

int main(){
	cin>>n>>m>>t;
	cin>>sx>>sy>>fx>>fy;
	for(int i=1;i<=n;i++){
		for(int y=1;y<=m;y++){
			a[i][y]=1;
		}
	}
	for(int i=1;i<=t;i++){
		int x,y;
		cin>>x>>y;
		a[x][y]=0;
	}
	dfs(sx,sy);
	cout<<sum;
	return 0;
}

P1019 [NOIP 2000 提高组] 单词接龙(疑似错题)

提交答案加入题单复制题目

题目背景

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。本题的难度仅代表设计算法可以通过本题原始数据的难度。

本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容

NOIP2000 提高组 T3

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastastonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 atatide 间不能相连。

输入格式

输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词,输入的最后一行为一个单个字符,表示"龙"开头的字母。你可以假定以此字母开头的"龙"一定存在。

输出格式

只需输出以此字母开头的最长的"龙"的长度。

输入输出样例

输入 #1复制

复制代码
5
at
touch
cheat
choose
tact
a

输出 #1复制

复制代码
23

说明/提示

样例解释:连成的"龙"为 atoucheatactactouchoose

n≤20。

实现代码:

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 30;
int n, vis[N], ans;
string s[N];
char c;

void dfs(const string &tmp) {
    ans = max(ans, int(tmp.size()));
    for (int i = 1; i <= n; ++i) {
        if (vis[i] >= 2) continue;
        for (int j = 1; j < min(tmp.size(), s[i].size()); ++j)
            if (tmp.substr(tmp.size() - j) == s[i].substr(0, j)) {
                ++vis[i];
                dfs(tmp + s[i].substr(j));
                --vis[i];
            }
    }
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> s[i];
    cin >> c;
    for (int i = 1; i <= n; ++i) if (s[i][0] == c) {
        ++vis[i];
        dfs(s[i]);
        --vis[i];
    } cout << ans << '\n';
    return 0;
}

P1101 单词方阵

题目描述

给一 n×n 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。

输入格式

第一行输入一个数 n。(7≤n≤100)。

第二行开始输入 n×n 的字母矩阵。

输出格式

突出显示单词的 n×n 矩阵。

输入输出样例

输入 #1复制

复制代码
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出 #1复制

复制代码
*******
*******
*******
*******
*******
*******
*******

输入 #2复制

复制代码
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出 #2复制

复制代码
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

实现代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
char ch[105][105];
char mark[105][105];
int dx[8]={-1,-1,-1,0,0,1,1,1 };
int dy[8]={-1 ,0,1,1,-1,1,-1,0};
char s[7]={'y','i','z','h','o','n','g'};

void dfs(int x,int y){
	for(int i=0;i<8;i++){
		int f=1;
		for(int j=1;j<=6;j++){
			int nx=x+j*dx[i];
			int ny=y+j*dy[i];
			if(nx<1||nx>n||ny<1||ny>n){
				f=0;
				break;
			}
			if(s[j]!=ch[nx][ny]){
				f=0;
				break;
			}
		}
		if(f==0) continue;
		for(int j=0;j<=6;j++){
			int nx=x+j*dx[i];
			int ny=y+j*dy[i];
			mark[nx][ny]=ch[nx][ny];
		}
	}
	return;
}

int main(){
	cin>>n;
	memset(mark,0,sizeof(mark));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>ch[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(ch[i][j]=='y'){
				dfs(i,j);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mark[i][j]==0){
				cout<<"*";
			}
			else cout<<mark[i][j];
		}
		cout<<endl;
	}
	return 0;
}

P2404 自然数的拆分问题

题目描述

任何一个大于 1 的自然数 n,总可以拆分成若干个小于 n 的自然数之和。现在给你一个自然数 n,要求你求出 n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式

输入:待拆分的自然数 n。

输出格式

输出:若干数的加法式子。

输入输出样例

输入 #1复制

复制代码
7

输出 #1复制

复制代码
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

说明/提示

数据保证,2≤n≤8。

实现代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];

void  print(int x){
	for(int i=0;i<x;i++){
		if(i==0){
			cout<<a[i];
		}
		else{
			cout<<"+"<<a[i];
		}
	}
	cout<<endl;
	return;
}

void dfs(int x,int y,int z){
	if(x==n) return;
	if(y==n){
		print(z);
		return;
	}
	for(int i=x;i<=n-y;i++){
		a[z]=i;
		dfs(i,y+i,z+1);
	}
}

int main(){
	cin>>n;
	dfs(1,0,0);
	return 0;
}
相关推荐
网域小星球2 小时前
C++ 从 0 入门(四)|继承、多态、this 指针、深浅拷贝(C++ 面试终极收官)
开发语言·c++·面试·多态·继承·this指针·深浅拷贝
chipsense2 小时前
霍尔电流传感器选型方法论再升级:从800V平台到TMR竞争的全场景决策树
算法·决策树·机器学习·闭环霍尔·tmr传感
CoderYanger2 小时前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
想唱rap2 小时前
C++智能指针
linux·jvm·数据结构·c++·mysql·ubuntu·bash
会编程的土豆3 小时前
【日常做题】 代码随想录(岛屿最大面积+寻宝)
数据结构·算法·图论
前进吧-程序员3 小时前
现代 C++ 异步编程:从零实现一个高性能 ThreadPool (C++20 深度实践)
开发语言·c++·c++20
阿洛学长3 小时前
汉洛塔结构思维
算法
木子n13 小时前
第2篇:坐标变换与数学基础:FOC算法的核心数学工具
算法·电机控制·foc
阿Y加油吧4 小时前
两道经典 DP 题:零钱兑换 & 单词拆分(完全背包 + 字符串 DP)
算法