#include using namespace std; //typedef typedef unsigned int UINT; typedef unsigned long long ULL; typedef long long LL; typedef long double LD; typedef pair PLL; typedef tuple TLL3; typedef tuple TLL4; typedef set > setdownLL; #define PQ priority_queue typedef PQ, greater > pqupLL; //container utill #define ALL(v) (v).begin(),(v).end() #define CR [](auto element1, auto element2){return element1>element2;} #define LB lower_bound #define UP upper_bound #define PB push_back #define MP make_pair #define MT make_tuple //constant #define PI 3.141592653589793 const LL MOD=1000000007; int main(){ //input LL H,W; cin >> H >> W; string gri[H]; LL i,j,k; for(i=0; i> gri[i]; } bool vercan=1, horcan=1; //find vertical from left to right for(j=0; j<=W-2; j++){ for(i=0; i=0; k--){ if(gri[k][j]!='?'&&gri[k][j]==gri[k+1][j]){ cout << 0 << endl; return 0; } if(gri[k][j+1]!='?'&&gri[k][j+1]==gri[k+1][j+1]){ cout << 0 << endl; return 0; } if(gri[k+1][j]=='0'){ gri[k][j]='1'; gri[k][j+1]='1'; }else{ gri[k][j]='0'; gri[k][j+1]='0'; } } for(k=i+1; k=0; j--){ for(i=0; i=0; k--){ if(gri[k][j]!='?'&&gri[k][j]==gri[k+1][j]){ cout << 0 << endl; return 0; } if(gri[k][j+1]!='?'&&gri[k][j+1]==gri[k+1][j+1]){ cout << 0 << endl; return 0; } if(gri[k+1][j]=='0'){ gri[k][j]='1'; gri[k][j+1]='1'; }else{ gri[k][j]='0'; gri[k][j+1]='0'; } } for(k=i+1; k=0; k--){ if(gri[i][k]!='?'&&gri[i][k]==gri[i][k+1]){ cout << 0 << endl; return 0; } if(gri[i+1][k]!='?'&&gri[i+1][k]==gri[i+1][k+1]){ cout << 0 << endl; return 0; } if(gri[i][k+1]=='0'){ gri[i][k]='1'; gri[i+1][k]='1'; }else{ gri[i][k]='0'; gri[i+1][k]='0'; } } for(k=j+1; k=0; i--){ for(j=0; j=0; k--){ if(gri[i][k]!='?'&&gri[i][k]==gri[i][k+1]){ cout << 0 << endl; return 0; } if(gri[i+1][k]!='?'&&gri[i+1][k]==gri[i+1][k+1]){ cout << 0 << endl; return 0; } if(gri[i][k+1]=='0'){ gri[i][k]='1'; gri[i+1][k]='1'; }else{ gri[i][k]='0'; gri[i+1][k]='0'; } } for(k=j+1; k