打死我也不说!

本文介绍了一种算法,通过深度优先搜索(DFS)在矩阵中寻找特定序列“DSWYBS”。算法需检查序列是否沿行、列或斜45度方向排列,并在找到时返回序列两端字母的坐标及密码计算方式。

梗:最好的密电码是啥? 是“打死我也不说!”这样,即使帮我们传送密电码的猪队友被敌人抓住严刑拷打,我们也不用担心泄露秘密。

现在稍微改进一下,我们把“打死我也不说”的拼音首字母“DSWYBS”藏在一个矩阵里,而代表“打”的字母D和代表“说”的字母S所在的行列下标之和即是密码。

对于给定的矩阵,请判断其中是否藏有“DSWYBS”,如果有,给出首末两个字母的下标并计算密码;如果没有,打印一行“DSWYBS”。

注意:

  • 若藏有“DSWYBS”,则这串字母必是沿行、列或斜45度方向依次排列的。
  • 题目保证输入的矩阵至多藏有一串“DSWYBS”。
  • 矩阵左上角下标为(0,0)。
  • 区分大小写。
  • 题目保证输入的矩阵不含有类似这样的排列(即:仅有DSWYB五个字母,但是字母B与S相邻,可组成DSWYBS的排列 ) :
    DSB
     WY
    

输入格式:

第一行给出两个整数MN(均不大于15、不小于4),接下来M行,每行有N个字母或数字,以换行结束。

输出格式:

如果输入矩阵中藏有“DSWYBS”,则输出三行,第一行和第二行分别是首字母D的下标和末字母S的下标,先行下标列下标,以一个空格间隔。第三行给出两个字母四项下标值之和。

如果没藏有该串字母,则打印一行“DSWYBS”

输入样例1:

8 10
0x00z000d0
00aD00s000
00b0SWk000
000wcY000s
00000B0000
0000S00000
0000000000
0000000000

输出样例1:

1 3
5 4
13

输入样例2:

5 5
12345
adswa
54321
dswys
aaaaa

输出样例2:

DSWYBS

分析:

       一开始以为是五子棋一样的套路,提交过一遍之后发现好像不对,重看了一遍题目。从样例1可以看出是从一个点的八个方向出发,只要找到如此匹配的几个字符就可以了。于是改用深搜的做法,提交了几次总是不过,以为递归写错了。最后发现是dx,dy赋值语句错了,在遍历的时候把原先的dx,dy覆盖了。于是加上break,找到直接跳出循环。

#include<iostream>

using namespace std;

int M, N, dx, dy, sx, sy, sum;
int flag = 0;
char map[15][15];
string ans = "DSWYBS";
int direc[8][2] = {{0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}};

void dfs(int step, int i, int j){
	if(step == 6){
		sx = i;
		sy = j;
		flag = 1;
		return ;
	}
	for(int k = 0; k < 8; k++){
		int nxt_i = i + direc[k][0], nxt_j = j + direc[k][1];
		if(nxt_i >= 0 & nxt_i < M && nxt_j >= 0 && nxt_j < N && map[nxt_i][nxt_j] == ans[step]){
			dfs(step + 1, nxt_i, nxt_j);
		}
	}
}

int main(){
	char ch;
	cin >> M >> N;
	for(int i = 0; i < M; i++){
		for(int j = 0; j < N; j++){
			cin >> ch;
			map[i][j] = ch;
		}
	}
	for(int i = 0; i < M; i++){
		for(int j = 0; j < N; j++){
			if(map[i][j] == 'D') dfs(1, i, j);
			if(flag){
				dx = i;
				dy = j;
				break;
			}
		}
		if(flag) break;
	}
	if(flag){
		sum = dx + dy + sx + sy;
		cout << dx << ' ' << dy << endl;
		cout << sx << ' ' << sy << endl;
		cout << sum;
	}else{
		cout << "DSWYBS";
	}
	return 0;
}

 

<think>好的,用户遇到了.zshrc文件导致的zsh死循环问题,需要修复。首先,我得理解这个问题的常见原因。通常,死循环发生在.zshrc文件中某些命令或配置重复执行,比如在启动时反复调用会启动新shell实例的命令,例如在配置中不小心执行了zsh本身,导致无限循环。 接下来,我需要考虑解决步骤。首先,用户需要能够编辑.zshrc文件,但由于shell启动时就崩溃,可能无法正常进入终端。这时候应该通过其他方式启动shell,比如使用恢复模式或者绕过.zshrc的执行。例如,启动zsh时加上--no-rcs选项,或者使用/bin/sh这样的基本shell来编辑文件。 然后,用户需要检查.zshrc中的可疑代码。常见的错误可能包括:在配置中调用了zsh或exec zsh,导致重新加载;或者某些插件或函数在初始化时产生了循环调用。此外,PATH变量的错误修改也可能导致命令找不到,进而引发问题。 另外,建议用户使用调试模式来逐步执行.zshrc,找到具体出错的位置。这可以通过在zsh启动时添加-x选项来实现,或者在.zshrc开头添加set -x,这样可以看到每条命令的执行情况,助定位问题。 如果用户不确定哪部分出问题,可以采用二分法,逐步注释掉部分配置,然后测试是否解决问题,从而缩小范围。修复后,记得移除调试选项,避免输出过多信息影响日常使用。 最后,为了防止未来出现类似问题,建议用户在修改.zshrc前备份,并在每次修改后通过source命令测试,而不是直接重启终端。此外,使用版本控制系统管理配置文件也是一个好习惯。 现在需要将这些步骤整理成用户易懂的中文回答,确保结构清晰,分步骤说明,并引用相关的参考资料。比如,引用中提到的恢复模式或绕过配置文件的方法,可能类似于引用[1]中的处理方式,但需要根据具体情况调整。</think>### 如何修复 Zsh 中 `.zshrc` 文件引起的死循环问题? #### 问题原因 当 `.zshrc` 文件中包含某些会重复触发 Shell 重新加载的命令时(例如递归调用 `zsh` 或 `exec zsh`,或某些插件/脚本逻辑错误),可能导致终端启动时陷入死循环,表现为卡顿、崩溃或反复重启。 --- #### 解决步骤 1. **通过安全模式编辑 `.zshrc`** - **绕过配置文件启动 Zsh**: ```bash # 启动时不加载任何配置文件 zsh --no-rcs ``` 或使用更基础的 Shell 环境(如 Bash 或 Sh): ```bash /bin/sh # 进入基本 Shell 环境 ``` - **编辑文件**: ```bash nano ~/.zshrc # 或使用 vim/其他编辑器 ``` 2. **定位问题代码** - **常见问题点**: - 直接调用 `zsh` 或 `exec zsh`。 - 递归加载插件(如 `source ~/.zshrc` 嵌套调用)。 - 某些条件语句(如 `if` 块)因变量未定义导致无限循环。 - **示例错误代码**: ```bash # 错误示例:递归调用自身 echo "Reloading..." && exec zsh ``` 3. **逐行注释排查** - 使用 `#` 临时注释可疑行,保存文件后测试: ```bash # source ~/some-plugin.zsh # export PATH="/invalid/path:$PATH" # 错误 PATH 可能导致循环 ``` - **逐步恢复**:每次取消注释 1-2 行,重启终端验证。 4. **启用调试模式** - **在 Zsh 启动时打印执行过程**: ```bash zsh -x # 启动时显示每条命令的执行 ``` - 或在 `.zshrc` 开头添加 `set -x`,结尾添加 `set +x`: ```bash set -x # 开始调试 # ... 其他配置 set +x # 结束调试 ``` 5. **修复后操作** - 移除调试语句(如 `set -x`)。 - 保存文件并正常启动 Zsh: ```bash exec zsh # 或关闭终端重新打开 ``` --- #### 避免再次发生 - **备份配置文件**: ```bash cp ~/.zshrc ~/.zshrc.bak # 修改前备份 ``` - **测试修改**: ```bash source ~/.zshrc # 直接加载配置,无需重启终端 ``` - **使用版本控制**: 将 `.zshrc` 托管到 Git 仓库,便于回退。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值