字符串的特殊读取——基于蓝桥杯两道题目(C/C++)
目录
1 例题
1.1 卡片换位
1.2 人物相关性分析
2 字符串的读取
2.1 综述
2.2 scanf
2.3 getline/getchar/get
2.4 注意
2.5 说明
3 C语言中字符串有关问题
3.1 常用函数
3.2 使用实例
3.3 附一些函数
先看例题
1 例题
1.1 卡片换位
问题描述
你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式:
输入两行6个字符表示当前的局面
输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
这道题第一眼是很难想到是一道搜索题,原因在于没有对空格进行一个正确的理解:
我们知道一个人物可以挪到空格去,但我们可以这样想,
空格也可以代表一个人物(这里将他命名为K),这个人物的特殊之处在于他可以与周围的任何一个人交换位置。
那么我们在最开始的时候就记录几个特殊点的坐标:A关羽,B张飞,K空格,就能够设置搜索的边界了
那么进行搜索时总要有一个开始点,不妨我们选择让空格主动出击,主动去和周围的人物交换,进行上下左右的尝试
每dfs一次就是对华容道阵容的一次更新
重点思路就是这样,下面看一下代码的具体实现
代码(附讲解):
#include using namespace std; int Min=INT_MAX;//设置成最大值 struct { int x,y; }a,b,k;//结构体定义A,B,空格坐标 int vis[3][3][3][3][3][3];//记忆化搜索 int Next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//上下左右走 void dfs(int x1,int y1,int x2,int y2,int x,int y,int step) { if(step>Min) return;//边界1,走不出去了 if(x1==b.x&&y1==b.y&&x2==a.x&&y2==a.y)//边界2,交换完成 { Min=min(step,Min); return; } if(x1||y2) return;//边界3,走出迷宫边界 if(vis[x1][y1][x2][y2][x][y]==1) return;//边界4,已经搜索过这种情况了 vis[x1][y1][x2][y2][x][y]=1;//开始dfs主干部分 for(int i=0;i= 0 && isalpha(s[i - 1]) || i + 5 = 0 && isalpha(s[i - 1]) || i + 3
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。