(1)编写程序sy1-7.c,要求从键盘输入一个字符,输出其前后相邻的两个字符,并另起一行在对应位置输出相应的ASCII码值。例如,输入字符为D,则输出 C E 67 69(ASCII)
时间: 2023-05-19 21:01:28 浏览: 162
以下是sy1-7.c的代码:
```c
#include <stdio.h>
int main() {
char c;
printf("请输入一个字符:");
scanf("%c", &c);
printf("%c\t%c\t%d\n", c-1, c+1, c-1);
printf("%d\t%d\t%d\n", c, c+2, c+1);
return 0;
}
```
当输入字符为D时,输出结果为:
```
请输入一个字符:D
C E 67
68 70 69
```
其中第一行输出了D的前后相邻字符C和E,以及它们对应的ASCII码值67和69;第二行输出了D的ASCII码值68,以及它后面两个字符F和G的ASCII码值70和71。
相关问题
编写程序sy1-7.c,要求从键盘输入一个字符,输出其前后相邻的两个字符,并另起一行在对应位置输出相应的ASCII码值。例如,输入字符为D,则输出 C E
以下是程序sy1-7.c的代码:
```
#include <stdio.h>
int main() {
char c;
printf("请输入一个字符:");
scanf("%c", &c);
printf("前一个字符:%c,ASCII码值:%d\n", c - 1, c - 1);
printf("当前字符:%c,ASCII码值:%d\n", c, c);
printf("后一个字符:%c,ASCII码值:%d\n", c + 1, c + 1);
return 0;
}
```
如果输入字符为D,则输出为:
```
请输入一个字符:D
前一个字符:C,ASCII码值:67
当前字符:D,ASCII码值:68
后一个字符:E,ASCII码值:69
```
平行时空 题目描述 周末放假回到了家,由于在学校很累,你很快的睡着了,做了一个神奇的梦,梦见你和平行时空的你被困在了一个n行m列的孤岛上。孤岛上含有平地,陷阱和传送门三种不同的地块。你和平行时空的你都可以上下左右移动到相邻的地块中,可是平行时空的你只能同时以相反的方向移动(即你和平行时空的你移动方向相反),两人均不能跨过孤岛的边界,即到达孤岛外的地方,并且任何人到达陷阱处会立即死亡,问你能否找到一个移动序列,使得两个人均能从传送门离开,其中一个人达到传送门后一定会离开孤岛不会再回来。如果你能够找到这样的移动序列,输出该序列的最短长度,否则输出-1。 输入格式 第一行输入四个整数n,m,x,y,表示n行m列的孤岛,初始两人在x行y列的地块中。 接下来n行,每行是一个包含m个字符的字符串,字符串仅包含 .#@ 三种字符,分别表示平地、陷阱和传送门。 数据保证两人初始时所在(x,y)位置是平地。 输出格式 如果能找到两个人离开的路径,输出该路径的最短长度,否则输出-1。 20%的数据保证:1<=n,m<=10 20%的数据保证:1<=n,m<=500 100%的数据保证:1<=n,m<=2e3,1<=x<=n,1<=y<=m 用c++代码敲“
这是一个非常有趣的图搜索问题,涉及到两个角色在相互制约的情况下探索一张地图并尝试到达特定的目标。下面我会详细介绍如何设计一个基于广度优先搜索(BFS)算法的解决方案来解决这个问题,并提供相应的C++代码示例。
### 分析
在这个问题中,有以下几个关键点:
- **双向运动**:你往某个方向走一步,则另一个你需要控制的角色必须向相反方向也走一步。
- **障碍物与传送门**:当任意一方遇到陷阱(`#`)则直接失败;只有两者都能成功抵达不同的传送门(`@`),才算是找到了解法;
- **不可穿越边界**:任何时刻都不能让任一玩家走出岛屿范围之外;
因为每次移动都是同步且相对立的,所以实际上我们只需要考虑一半的可能性——比如只看当前坐标(x,y),而另一端自然就是(n-x+1, m-y+1).
#### 算法思路 (BFS)
我们可以将整个迷宫视为一个无权图,节点是每个格子的位置 `(i,j)` 对应的状态 `[i][j]`, 边则是有效的四邻域转移动作(上下左右)。对于每一个状态,我们需要记录当前位置、已经经过了多少步以及是否有一个或两个都到了出口等信息。
为了确保最短路径,采用队列辅助层次遍历的方式逐步拓展可达区域直至找到可行方案为止或者穷尽所有可能性后宣告失败(-1)。
```cpp
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAX = 2005;
int dx[] = { -1, 0, 1, 0 }; // 上右下左 四个方向增量数组X轴部分
int dy[] = { 0, 1, 0, -1 }; // Y轴对应的部分
char map[MAX][MAX];
bool visited[MAX][MAX];
struct Node {
int x, y; // 当前人的位置
int step; // 步数计数器
Node(int _x=0,int _y=0):x(_x),y(_y){step=0;}
};
// 判断某一点是否有效(不出界并且不是陷阱)
inline bool valid(int nx, int ny, int n, int m){
return nx >= 1 && nx <= n && ny >= 1 && ny <= m && map[nx][ny]!='#' ;
}
void bfs(const int &n, const int &m, pair<int, int> start_pos) {
memset(visited,false,sizeof(bool)*MAX*MAX);
queue<Node> q;
q.push(Node(start_pos.first,start_pos.second));
visited[start_pos.first][start_pos.second]=true;
while (!q.empty()) {
auto cur=q.front();
if(map[cur.x][cur.y]=='@'){cout << "Found exit at:"<<cur.step<<endl;break;}else{
for (size_t i = 0; i < 4; ++i) {
int next_x = cur.x + dx[i], next_y = cur.y + dy[i];
int oppo_next_x=n-(next_x)+1,oppo_next_y=m-(next_y)+1;
// 检查新位置及其镜像位置的有效性和访问情况
if(valid(next_x,next_y,n,m)&&valid(oppo_next_x,oppo_next_y,n,m)){
if(!visited[next_x][next_y]){
q.emplace(next_x,next_y);
visited[next_x][next_y]=true;
if((map[next_x][next_y]=='@'&&map[oppo_next_x][oppo_next_y]!='.')||
(map[next_x][next_y]!='.'&&map[oppo_next_x][oppo_next_y]='@'))
cout<<"Minimum steps required:"<<cur.step+1<<endl,
exit(0);
}
}
}
q.pop();
if(q.empty())
cout<< "-1"<< endl;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, sx,sy;
cin >> n >> m>>sx>>sy;
string tmp;
getline(cin,tmp); // 吃掉换行符
for(int i=1;i<=n;++i)getline(cin,map[i]+1);
bfs(n,m,pair<int,int>(sx,sy));
return 0;
}
```
这段程序实现了对上述逻辑的基本模拟,并利用了标准模板库中的 `queue` 来支持 BFS 遍历过程。请注意实际应用时还需要根据具体情况调整细节处理如读取输入等环节。
阅读全文
相关推荐















