c++程序题输入及处理总结(自用)(二)
·
目录
1.图的输入:(处理)n行包含m个字符的字符串
例如:
5 5
..S..
****.
T....
****.
.....
/*题目描述
Jungle 生活在美丽的蓝鲸城,大马路都是方方正正,但是每天马路的封闭情况都不一样。地图由以下元素组成:
1)”.” - 空地,可以达到;
2)”*” - 路障,不可达到;
3)"S” - Jungle的家;
4)”T” - 公司.
其中我们会限制Jungle拐弯的次数,同时Jungle可以清除给定个数的路障,现在你的任务是计算Jungle是否可以从家里出发到达公司。
输入描述
输入的第一行为两个整数tc(o<tc<100)t代表可以拐弯的次数,c代表可以清除的路陪个数
输入的第二行为两个整数n,m(1≤n,m≤100),代表地图的大小。
接下来是n行包含m个字符的地图。n和m可能不一样大。
我们保证地图里有S和T。
输出描述
输出是否可以从家里出发到达公司,是则输出YES,不能则输出NO。
示例1:
输入
2 0
5 5
..S..
****.
T....
****.
.....
输出
YES
示例2:
输入
1 2
5 5
.*S*.
*****
..*..
*****
T....
输出
NO
说明 该用例中,至少需要拐弯1次,清除3个路障,所以无法到达*/
//用tuple和哈希
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <unordered_set>
#include <functional>
#include <tuple>
using namespace std;
int main() {
int tc, c;
cin >> tc >> c;
int n, m;
cin >> n >> m;
vector<string> grid(n);
int start_x = -1, start_y = -1;
int target_x = -1, target_y = -1;
for (int i = 0; i < n; i++) {
cin >> grid[i];
for (int j = 0; j < m; j++) {
if (grid[i][j] == 'S') {
start_x = i;
start_y = j;
} else if (grid[i][j] == 'T') {
target_x = i;
target_y = j;
}
}
}
// 方向数组
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
// 使用unordered_set记录访问状态 (x, y, turns, clears, dir)
unordered_set<string> visited;
queue<tuple<int, int, int, int, int>> q; // x, y, turns, clears, dir
// 从起点开始
for (int dir = 0; dir < 4; dir++) {
auto state = make_tuple(start_x, start_y, 0, 0, dir);
string key = to_string(start_x) + "," + to_string(start_y) + "," +
to_string(0) + "," + to_string(0) + "," + to_string(dir);
visited.insert(key);
q.push(state);
}
bool found = false;
while (!q.empty()) {
auto [x, y, turns, clears, dir] = q.front();
q.pop();
if (x == target_x && y == target_y) {
found = true;
break;
}
for (int new_dir = 0; new_dir < 4; new_dir++) {
int nx = x + dx[new_dir];
int ny = y + dy[new_dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
int new_turns = turns;
if (new_dir != dir) new_turns++;
int new_clears = clears;
if (grid[nx][ny] == '*') new_clears++;
if (new_turns > tc || new_clears > c) continue;
string new_key = to_string(nx) + "," + to_string(ny) + "," +
to_string(new_turns) + "," + to_string(new_clears) + "," +
to_string(new_dir);//状态编码为字符串
if (visited.find(new_key) == visited.end()) {
visited.insert(new_key);// 新状态,加入哈希表和队列
q.push(make_tuple(nx, ny, new_turns, new_clears, new_dir));
}
}
}
cout << (found ? "YES" : "NO") << endl;
return 0;
}
2.(处理)一行用特殊字符分隔的字符串
例如:
25G3C-abc-d(字符)
1,0,0,0,0,1,0,0,1,0,1(数字)
/*给定一个非空字符串 S,其被 N 个’-‘分隔成 N+1 的子串,给定正整数 K,要求除第一个子串外,其余的串每 K 个用’-‘分隔,并将小写字母转换为大写。
输入描述
正整数 K 和‘-’分割的字符串,如:
2
25G3C-abc-d
输出描述
转换后的字符串
示例 1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
4
5F3Z-2e-9-w
输出
5F3Z-2E9W
解释
字符串 S 被分成了两个部分,每部分 4 个字符;
注意,两个额外的破折号需要删掉。
示例 2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
2
2-5g-3-J
输出
2-5G-3J
解释
字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
*/
#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;
string f(int k,const string& s){
if(s.empty()){return "";}
// 1. 先移除所有'-'并转换为大写
string cleanstr;
for(char c:s){
if(c!='-'){
cleanstr+=toupper(c);
}
}
// 2. 找到第一个子串的结束位置(第一个'-'在原始字符串中的位置)
size_t firstend=0;
for(;firstend<s.size();firstend++){
if(s[firstend]=='-')break;
}
int firstlen=firstend;
if(firstlen==s.size()){
return cleanstr;
}
string result=cleanstr.substr(0,firstlen);
int remainlen=cleanstr.size()-firstlen;
for(int i=firstlen;i<cleanstr.size();i+=k){
result+='-';
int chunksize=min(k,remainlen);
result+=cleanstr.substr(i,chunksize);
remainlen-=chunksize;
}
return result;
}
int main(){
int k;string s;
cin>>k;
cin>>s;
string result=f(k,s);
cout<<result<<endl;
}
/*停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车为了防剐蹭,
需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离。
输入描述
1.一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。
2.停车位最多100个。
输出描述
输出一个整数记录最大距离
示例1:
输入:
1,0,0,0,0,1,0,0,1,0,1
输出:
2
*/
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <climits>
using namespace std;
int main()
{
string input;
getline(cin,input);
vector<int>parking;
stringstream ss(input);
string token;
while(getline(ss,token,',')){//从字符串流 ss 中读取字符,直到遇到分隔符 , 或者到达流末尾,将读取的内容存储到 token 中。
parking.push_back(stoi(token));//stoi将字符串转换为整数
}
int n=parking.size();
vector<int>carindices;
for(int i=0;i<n;i++){
if(parking[i]==1){
carindices.push_back(i);
}
}
int maxDist = 0;
for (int i = 0; i < n; i++) {
if (parking[i] == 0) {
int leftdist=INT_MAX;
int rightdist=INT_MAX;
// 在已排序的车辆索引中查找第一个 >= 当前空位索引 i 的位置
//lower_bound 找到的是第一个大于等于当前位置的车辆
auto it=lower_bound(carindices.begin(),carindices.end(),i);
if(it!=carindices.begin()){
leftdist=i-*(--it);
// --it:向前移动一位,指向左边最近的车辆
// *(--it):获取左边最近车辆的索引
// i - *(--it):计算当前空位到左边最近车辆的距离
}
// 找右边最近的1
it = lower_bound(carindices.begin(), carindices.end(), i);
if (it != carindices.end()) {
rightdist = *it - i;
}
int minDist = min(leftdist, rightdist);
if (minDist != INT_MAX) {
maxDist = max(maxDist, minDist);
}
}}
cout << maxDist << endl;
return 0;
}
更多推荐


所有评论(0)