QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#399922 | #5070. Check Pattern is Bad | tder | WA | 1ms | 3692kb | C++14 | 2.8kb | 2024-04-26 19:48:21 | 2024-04-26 19:48:21 |
Judging History
answer
// just for test
// just for test
// just for test
// just for test
// just for test
// 10s...mt19937 yyds!!!
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int dx[4]={-1,-1,0,0},dy[4]={-1,0,-1,0}; // 方向数组
char mp(bool b){return b?'W':'B';}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin>>t;
while(t--){
int n,m; cin>>n>>m;
mt19937 g(time(0));
uniform_int_distribution<> u(0,1);
vector<string> a(n);
for(auto &i:a)cin>>i;
auto cl=[&](int x,int y){
for(int i=0;i<4;i++){
int x0=x+dx[i],y0=y+dy[i];
if(~min(x0,y0)&&x0+1<n&&y0+1<m){
vector<pii> p={
make_pair(x0,y0),
make_pair(x0+1,y0),
make_pair(x0,y0+1),
make_pair(x0+1,y0+1)};
// 子矩阵中四个元素
int c=0;
for(auto [x1,y1]:p)
if(make_pair(x1,y1)!=make_pair(x,y)&&a[x1][y1]=='?')c++;
// 判断其他字符是否是 ?
if(c)continue; // 该子矩阵不能确定
switch(i){
case 0:
if(a[x0+1][y0]==a[x0][y0+1]&&a[x0+1][y0]!=a[x0][y0])
if(a[x][y]==a[x0][y0])return false;
else a[x][y]=a[x0+1][y0];
break;
// 先判矛盾然后染色
case 1:
if(a[x0][y0]==a[x0+1][y0+1]&&a[x0][y0+1]!=a[x0][y0])
if(a[x][y]==a[x0][y0+1])return false;
else a[x][y]=a[x0][y0];
break;
case 2:
if(a[x0][y0]==a[x0+1][y0+1]&&a[x0+1][y0]!=a[x0][y0])
if(a[x][y]==a[x0+1][y0])return false;
else a[x][y]=a[x0][y0];
break;
case 3:
if(a[x0+1][y0]==a[x0][y0+1]&&a[x0+1][y0]!=a[x0+1][y0+1])
if(a[x][y]==a[x0+1][y0+1])return false;
else a[x][y]=a[x0+1][y0];
break;
}
}
}
return true;
}; // 染色构造,返回值为是否有矛盾
bool f=true;
for(int i=0;i<n&&f;i++)
for(int j=0;j<m&&f;j++)f&=cl(i,j);
for(int i=n-1;~i&&f;i--)
for(int j=m-1;~j&&f;j--)f&=cl(i,j); // 记得把漏下的做一遍
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) cout<<a[i][j];
cout<<endl;
}
cout<<endl;
if(!f){/* cout<<"NO\n"; */ continue;} // 无解
while(1){
vector<string> r=a; f=true;
for(int i=0;i<n&&f;i++)
for(int j=0;j<m&&f;j++)
if(a[i][j]=='?')
if(f&=cl(i,j);a[i][j]=='?')a[i][j]=mp(u(g));
// 随机一下
for(int i=0;i<n&&f;i++)
for(int j=0;j<m&&f;j++)f&=cl(i,j); // 判断解的合法性
if(f)break; a=r;
}
// cout<<"YES\n";
// for(auto i:a)cout<<i<<'\n';
}
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3692kb
input:
3 2 2 ?? ?? 3 3 BW? W?B ?BW 3 3 BW? W?W ?W?
output:
?? ?? BW? WWB ?BW BW? WWW ?W?
result:
wrong answer Token parameter [name=yesno] equals to "??", doesn't correspond to pattern "YES|NO" (test case 1)