1110: 地砖问题---dfs
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色的地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
- dfs遍历图即可
#include <bits/stdc++.h>
using namespace std;
char g[30][30];
int st[30][30];
int n, m;
int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
int cnt;
void dfs(int x, int y) {
st[x][y] = 1;
for (int i = 0; i < 4; i++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && !st[xx][yy] &&
g[xx][yy] != '#') {
cnt++;
dfs(xx, yy);
}
}
// st[x][y] = 0;
}
int main() {
while (cin >> m >> n) {
memset(st, 0, sizeof st);
cnt = 1;
if (n == 0 && m == 0) break;
int x, y;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> g[i][j];
if (g[i][j] == '@') {
x = i, y = j;
}
}
}
dfs(x, y);
cout << cnt << endl;
}
return 0;
}
1113: 有序合并---归并排序
已知线性表LA和LB中的数据元素按值非递减有序排列,现要求LA和LB归并为一个新的线性表LC,且LC中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11),LB=(2,6,8,9,11,15,20)则LC=(2,3,6,6,8,8,9,11,11,15,20)。
- 归并排序
#include <bits/stdc++.h>
using namespace std;
int la[110], lb[110], lc[220];
int m, n;
int main() {
while (cin >> m) {
for (int i = 1; i <= m; i++) {
cin >> la[i];
}
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> lb[i];
}
// 归并排序
int l = 1, i = 1, j = 1;
while (i <= m && j <= n) {
if (la[i] <= lb[j]) {
lc[l++] = la[i++];
} else {
lc[l++] = lb[j++];
}
}
while (i <= m) {
lc[l++] = la[i++];
}
while (j <= n) {
lc[l++] = lb[j++];
}
for (int i = 1; i < l; i++) {
if(i == l-1) cout << lc[i] << endl ;
else
cout << lc[i] << " ";
}
}
return 0;
}
1114: 十六进制转换八进制
输入一个不超过100000位的十六进制数,请转换成八进制数。
注:十六进制数中,字母09还对应表示数字09。字母”A”(大写)表示10,”B”表示11,”...”,”F”表示15,比如:十六进制数A10B表示的是10进制数是10×163+1×162+0×161+11×160=41227。转换成的八进制数是120413,因为1×85+2×84+0×83+4×82+1×81+3×80=41227。
- 先将16进制转化为2进制,然后转化为8进制,判断是否是3的倍数,否则填加前导0,使其为3的倍数
#include <bits/stdc++.h>
using namespace std;
map<char, string> mp;
map<string, string> mp1;
int main() {
// 16进制转化为2进制
mp['0'] = "0000", mp['1'] = "0001", mp['2'] = "0010", mp['3'] = "0011",
mp['4'] = "0100", mp['5'] = "0101", mp['6'] = "0110", mp['7'] = "0111",
mp['8'] = "1000", mp['9'] = "1001", mp['A'] = "1010", mp['B'] = "1011",
mp['C'] = "1100", mp['D'] = "1101", mp['E'] = "1110", mp['F'] = "1111";
// 2进制转化为8进制
mp1["000"] = "0", mp1["001"] = "1", mp1["010"] = "2", mp1["011"] = "3",
mp1["100"] = "4", mp1["101"] = "5", mp1["110"] = "6", mp1["111"] = "7";
string str;
while (cin >> str) {
string s = "";
for (int i = 0; i < str.size(); i++) {
s += mp[str[i]];
}
int n = s.size();
if (n % 3 == 2) s = "0" + s;
if (n % 3 == 1) s = "00" + s;
string ans = "";
for (int i = 0; i < s.size(); i += 3) {
ans += mp1[s.substr(i, 3)];
}
int flag = 0;
for (int i = 0; i < ans.size(); i++) {
if (ans[i] == '0' && flag == 0) {
continue;
} else {
flag = 1;
}
cout << ans[i];
}
cout << endl;
}
return 0;
}