本题的 checker.cpp:
#include "testlib.h"
#include<cstring>
#define nb 100010
using namespace std;
int r, c, B, W, BB, WW;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
string s[nb];
vector<bool> vis[nb];
void init(){
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
vis[i].push_back(0);
}
}
}
void dfs(int x, int y){
vis[x][y] = 1;
for(int i = 0; i < 4; i++){
int x_ = x + dx[i], y_ = y + dy[i];
if(x_ < 0 || x_ >= r || y_ < 0 || y_ >= c) continue;
if(s[x_][y_] == s[x][y] && !vis[x_][y_]) dfs(x_, y_);
}
}
int main(int argc, char* argv[]){
registerTestlibCmd(argc, argv);
r = ouf.readInt();
c = ouf.readInt();
ouf.readEoln();
if(r * c > 100000){
quitf(_wa, "The panel is too big.");
}
for(int i = 0; i < r; i++){
s[i] = ouf.readLine();
if(s[i].size() != c){
quitf(_wa, "The size does not match.");
}
}
init();
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
if(!vis[i][j]){
dfs(i, j);
(s[i][j] == '@') ? ++B : ++W;
}
}
}
BB = inf.readInt(), WW = inf.readInt();
if(B != BB) quitf(_wa, "Expect %d black connected area(s), found %d", BB, B);
if(W != WW) quitf(_wa, "Expect %d white connected area(s), found %d", WW, W);
quitf(_ok, "The answer is correct.");
}
第一次用 testlib 库,已通过自制数据测试,若有 bug 欢迎指正