参考别人的代码,总结出了几种读入的办法:
scanf("%d %d", &n, &m);for (int i=0;i<n;i++)for (int j=0;j<m;j++)scanf(" %c",&a[i][j]);//注意这里有空格
char a[maxn][maxn];for (int i=0;i<n;i++)scanf("%s",a[i]);//这里可以没有空格(加空格也阔以),同时读入字符串,前面没有取地址符//因为题目给的输入方式,一行中的字符之间没有空格,所以可以以字符串的形式读取
//如果输入形式为 S S W W . . W这样的话,scanf遇到空格会停止读入,cin也是
scanf读入空格的方法:scanf("%[^\n]",a[i]);
其中^\n代表以\n为结束符
当然也可以cin.getline(a[i], maxn);
以下是本题的几个完整代码,注意此类题查找相邻位置以及处理边界的方法。
还有可以不用看到'.'就更改为D,可以在确定Yes之后遍历数组,看到'.'就打印D,妙哉。
#include <bits/stdc++.h>
using namespace std;
#define clr(a, x) memset(a, x, sizeof(a))
#define mp(x, y) make_pair(x, y)
#define pb(x) push_back(x)
#define X first
#define Y second
#define fastin \ios_base::sync_with_stdio(0); \cin.tie(0);
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int N = 505;
char s[N][N];
bool vis[N][N];
int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};//←←重点在这里
int n, m;
void dfs(int x, int y, const char& c)
{if (x < 0 || y < 0 || x >= n || y >= m) return;//边界处理(这题因为可以直接全D,所以不一定要dfs)if (vis[x][y] || s[x][y] == '.') return;if (s[x][y] != c){cout << "No";exit(0);}vis[x][y] = 1;for (int i = 0; i < 4; i++) dfs(x + dx[i], y + dy[i], c);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("1.in", "r", stdin);freopen("1.out", "w", stdout);
#endifcin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) cin >> s[i][j];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (s[i][j] != '.' && !vis[i][j])dfs(i, j, s[i][j]);cout << "Yes" << endl;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (s[i][j] == '.')cout << "D";elsecout << s[i][j];}cout << endl;}return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};const int N=510;
char s[N][N];int main() {int n,m; scanf("%d%d",&n,&m);for (int i=0;i!=n;++i) scanf("%s",s[i]);int flag=0;for (int i=0;i!=n;++i) {for (int j=0;j!=m;++j) {for (int k=0;k!=4;++k) {int px=i+dx[k], py=j+dy[k];if (px>=0 && px<n && py>=0 && py<m && s[i][j]=='W' && s[px][py]=='S') flag=1;}}}if (flag) {printf("No\n");} else {printf("Yes\n");for (int i=0;i!=n;++i)for (int j=0;j!=m;++j)if (s[i][j]=='.') s[i][j] = 'D';for (int i=0;i!=n;++i) printf("%s\n",s[i]);}
}