注意一下判断a[i + 2][j] == 0这种类似的东西是会越界的,只需要把a的初始值全置1就行了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e3 + 4;
const int p = 998244353;
int n,m,c,f;
int a[MAXN][MAXN];
int prei[MAXN][MAXN],prej[MAXN][MAXN];
int pre[MAXN][MAXN],pre2[MAXN][MAXN];
void solve(){
cin >> n >> m >> c >> f;
/*for(int i = 0; i <= n + 2; i++){
for(int j = 0; j <= m + 2; j++){
a[i][j] = 1;
}
}*/
for(int i = 1; i <= n; i++){
string s;
cin >> s;
for(int j = 0; j < m; j++){
a[i][j + 1] = (s[j] == '1' ? 1 : 0);
}
}
for(int i = 0; i <= n + 1; i++){
for(int j = 0; j <= m + 1; j++){
prei[i][j] = 0;
prej[i][j] = 0;
pre[i][j] = 0;
pre2[i][j] = 0;
}
}
for(int i = 1; i <= n; i++){
for(int j = m; j >= 1; j--){
if(a[i][j] == 0){
prei[i][j] = prei[i][j + 1] + 1;
}
else{
prei[i][j] = 0;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
prej[i][j] = prej[i + 1][j] + 1;
}
else{
prej[i][j] = 0;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
pre[i][j] = pre[i + 1][j] + prei[i][j] - 1;
}
else{
pre[i][j] = 0;
}
}
}
int ansc = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(a[i][j] == 0 && a[i + 1][j] == 0 && a[i + 2][j] == 0){
ansc = (ansc + ((prei[i][j] - 1) % p * pre[i + 2][j] % p) % p) % p;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
pre2[i][j] = (pre2[i + 1][j] + (prej[i + 1][j] % p * prei[i][j + 1] % p) % p) % p;
}
else{
pre2[i][j] = 0;
}
}
}
int ansf = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(a[i][j] == 0 && a[i + 1][j] == 0 && a[i + 2][j] == 0){
ansf = (ansf + ((prei[i][j] - 1) % p * pre2[i + 2][j] % p) % p) % p;
}
}
}
cout << (ansc % p * c % p) % p << " " << (ansf % p * f % p) % p << endl;
}
signed main(){
//freopen("plant2.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T,id;
cin >> T >> id;
while(T--){
solve();
}
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e3 + 4;
const int p = 998244353;
int n,m,c,f;
int a[MAXN][MAXN];
int prei[MAXN][MAXN],prej[MAXN][MAXN];
int pre[MAXN][MAXN],pre2[MAXN][MAXN];
void solve(){
cin >> n >> m >> c >> f;
for(int i = 0; i <= n + 2; i++){
for(int j = 0; j <= m + 2; j++){
a[i][j] = 1;
}
}
for(int i = 1; i <= n; i++){
string s;
cin >> s;
for(int j = 0; j < m; j++){
a[i][j + 1] = (s[j] == '1' ? 1 : 0);
}
}
for(int i = 0; i <= n + 1; i++){
for(int j = 0; j <= m + 1; j++){
prei[i][j] = 0;
prej[i][j] = 0;
pre[i][j] = 0;
pre2[i][j] = 0;
}
}
for(int i = 1; i <= n; i++){
for(int j = m; j >= 1; j--){
if(a[i][j] == 0){
prei[i][j] = prei[i][j + 1] + 1;
}
else{
prei[i][j] = 0;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
prej[i][j] = prej[i + 1][j] + 1;
}
else{
prej[i][j] = 0;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
pre[i][j] = pre[i + 1][j] + prei[i][j] - 1;
}
else{
pre[i][j] = 0;
}
}
}
int ansc = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(a[i][j] == 0 && a[i + 1][j] == 0 && a[i + 2][j] == 0){
ansc = (ansc + ((prei[i][j] - 1) % p * pre[i + 2][j] % p) % p) % p;
}
}
}
for(int j = 1; j <= m; j++){
for(int i = n; i >= 1; i--){
if(a[i][j] == 0){
pre2[i][j] = (pre2[i + 1][j] + (prej[i + 1][j] % p * prei[i][j + 1] % p) % p) % p;
}
else{
pre2[i][j] = 0;
}
}
}
int ansf = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(a[i][j] == 0 && a[i + 1][j] == 0 && a[i + 2][j] == 0){
ansf = (ansf + ((prei[i][j] - 1) % p * pre2[i + 2][j] % p) % p) % p;
}
}
}
cout << (ansc % p * c % p) % p << " " << (ansf % p * f % p) % p << endl;
}
signed main(){
//freopen("plant2.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T,id;
cin >> T >> id;
while(T--){
solve();
}
}