社区讨论

虽然在搜索题单,却似乎不用搜索

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 条回复,欢迎继续交流。

正在加载回复...