字符串的特殊读取——基于蓝桥杯两道题目(C/C++)

04-13 1552阅读

目录

1  例题

字符串的特殊读取——基于蓝桥杯两道题目(C/C++)

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 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]