#模拟
#字符串
#数组
#cpp
题目描述
题解
方法:模拟
思路
直接模拟:
- 输入
r,c
- 判断结束
- 输入puzzle,存入
vector<string> grid
- 给“eligible"格子标记序号,存入
nums[11][11]
- 按格式输出"Across",“Down”的结果
注意:序号要设置输出宽度 setw(3)
。
代码
#include<bits/stdc++.h>
using namespace std;
int r, c;
vector<string> grid;
int nums[11][11];
int isPrint[11][11];
// 返回0表示输入结束
int readRC() {
cin >> r;
if (r == 0) {
return 0;
}
cin >> c;
return 1;
}
void readGrid() {
grid.clear();
string s;
for (int i = 0; i < r; i++) {
cin >> s;
grid.push_back(s);
}
}
// 判断是否可以记号码
bool isStart(int i, int j) {
return grid[i][j] != '*' && (i == 0 || j == 0 || grid[i][j-1] == '*' || grid[i-1][j] == '*');
}
// 判断是否是边界
bool isEnd(int i, int j) {
return (j == c || i == r || grid[i][j] == '*');
}
// 打标记(号码)
void mark() {
int no = 1;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (isStart(i, j)) {
nums[i][j] = no++;
} else {
nums[i][j] = 0;
}
}
}
}
void printAcross() {
cout << "Across\n";
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (nums[i][j]) {
// 注意输出格式
cout << setw(3) << right << nums[i][j] << ".";
cout << grid[i][j];
while(!isEnd(i, j+1)) {
cout << grid[i][++j];
}
cout << "\n";
}
}
}
}
void printDown() {
memset(isPrint, 0, sizeof(isPrint));
cout << "Down\n";
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
int ii = i;
if (!isPrint[ii][j] && nums[ii][j]) {
// 注意输出格式
cout << setw(3) << right << nums[ii][j] << ".";
cout << grid[ii][j];
isPrint[ii][j] = 1;
while(!isEnd(ii+1, j)) {
ii++;
cout << grid[ii][j];
isPrint[ii][j] = 1;
}
cout << "\n";
}
}
}
}
int main() {
int kase = 0;
while(readRC()) {
kase++;
if (kase != 1) {
cout << "\n";
}
cout << "puzzle #" << kase << ":\n";
readGrid();
mark();
printAcross();
printDown();
}
return 0;
}
复杂度分析
- 时间复杂度: O ( n 2 ) O(n^{2}) O(n2), 其中 n = r = c n = r = c n=r=c。
- 空间复杂度: O ( n 2 ) O(n^{2}) O(n2), 其中 n = r = c n = r = c n=r=c。