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
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
输入格式
输入的第一行为一个单独的整数 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;
}