#include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) vector> a; int h,w; bool Isvalid(int x,int y,vector> &Isseen){//ある平行移動がvaildか bool flag = 1; rep(i,h)rep(j,w){ if(a[i][j]=='.') continue;//すべての黒ますについて if(Isseen[i][j]) continue;//もしすでに見ていたらcontinue Isseen[i][j] = 1; //訪問済みにする int nowx = x+i,nowy = y+j;//平行移動先 if(nowx<0||h<=nowx||nowy<0||w<=nowy){//はみ出したらだめ flag = 0; break; } if(a[nowx][nowy]=='.'){//移動先が白でもダメ flag = 0; break; } if(Isseen[nowx][nowy]){ flag = 0;//移動先が訪問済みでもダメ break; } Isseen[nowx][nowy] = 2; } return flag; } int main(void){ cin >> h >> w; a.resize(h,vector (w)); int flag = 0; rep(i,h)rep(j,w){ cin >> a[i][j]; if(a[i][j]=='#') flag = 1; } if(!flag){ cout << "NO" << endl; return 0; } for(int i=-h+1;i<=h-1;i++){ for(int j=-w+1;j<=w-1;j++){ if(i==0&&j==0) continue; vector> Isseen(h,vector (w,0)); if(Isvalid(i,j,Isseen)){ //cout << i << j << endl; cout << "YES" << endl; //rep(i,h){ // rep(j,w) cout << Isseen[i][j]; // cout << endl; //} return 0; } } } cout << "NO" << endl; }