社区讨论
虽然在搜索题单,却似乎不用搜索
P1101单词方阵参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mk94ce42
- 此快照首次捕获于
- 2026/01/11 10:32 上个月
- 此快照最后确认于
- 2026/01/11 10:35 上个月
思路:
1)枚举开头字母y的位置;
2)再枚举8个字符串方向;
3)验证当前方向的单词是否为目标串;
4)如果是目标串就标记;
5)根据标记数组将未标记位置全部设置为'*'
问题:
这道题如果要使用搜索的话,应该是搜索每个字母y8个方向的字符串,然后再去判断得到字符串是否等于目标,等于就标记。但是这样标记数组如果搜索到的字符串不等于目标就要撤销标记,似乎比前面枚举思路更麻烦些。
开头思路参考:
CPP#include <bits/stdc++.h>
using namespace std;
const int N=1e2+2;
int n;
char a[N][N];
int vis[N][N];//当前仅当标记单词序列位置
int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},
{-1,-1},{1,1},{1,-1},{-1,1}};//方向
string s="yizhong";
bool check(int x,int y,int k){
//一个字符肯定相同,检验后面字符
int len=s.size();//获取目标串长度
for(int i=1;i<len;i++){
int nx=x+i*dir[k][0],ny=y+i*dir[k][1];
if(nx<1||nx>n||ny<1||ny>n) return false;//越界
if(a[nx][ny]!=s[i]) return false;//非目标串
}
return true;//返回字符串是否相等
}
void mark(int x,int y,int k){//标记是目标字符串位置
vis[x][y]=1;//标记是目标串位置
int len=s.size();//获取目标串长度
for(int i=1;i<len;i++){
int nx=x+i*dir[k][0],ny=y+i*dir[k][1];
vis[nx][ny]=1;
}
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>a[i][j];//输入
//枚举起点
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==s[0]){//可能是开头
for(int k=0;k<8;k++){//枚举方向
//检验当前方向单词是否为目标
bool flag=check(i,j,k);
//printf("(%d,%d) %d\n",i,j,flag);
if(flag) mark(i,j,k);
}
}
}
}
//更新a数组
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(!vis[i][j]) a[i][j]='*';
}
//输出
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cout<<a[i][j];
cout<<'\n';
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...