#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include ///////// #define REP(i, x, n) for(int i = x; i < n; i++) #define rep(i,n) REP(i,0,n) #define P(p) cout<<(p)< ///////// typedef long long LL; typedef long double LD; ///////// using namespace::std; ///////// int main(void){ std::cin.tie(0); std::ios::sync_with_stdio(false); std::cout << std::fixed;// cout << setprecision(10);// int W,H; cin>>W>>H; int field[100][100]; bool usefield[100][100]; rep(j,H)rep(i,W){ cin>>field[i][j]; usefield[i][j] = false; } queue< pair > > que; bool useNum[1001]; rep(i,1001)useNum[i] = false; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; for(int wi=0;wi > hit; hit.insert( pair(wi,hi) ); for(int d=0;d<4;++d){ if(0 <= wi+dx[d] && wi+dx[d] < W && 0 <= hi+dy[d] && hi+dy[d] < H){ if( terNum == field[ wi+dx[d] ][ hi+dy[d] ] ){ usefield[ wi+dx[d] ][ hi+dy[d] ] = true; hit.insert( pair(wi+dx[d],hi+dy[d]) ); que.push( pair >(d,pair(wi+dx[d],hi+dy[d]) ) ); } } } //////////////// pair > tque; int tx,ty; while( !que.empty() ){ tque = que.front(); tx = tque.second.first; ty = tque.second.second; que.pop(); for(int d=0;d<4;++d){ if( (tque.first+2)%4 != d && 0 <= tx+dx[d] && tx+dx[d] < W && 0 <= ty+dy[d] && ty+dy[d] < H){ if( terNum == field[ tx+dx[d] ][ ty+dy[d] ] ){ usefield[ tx+dx[d] ][ ty+dy[d] ] = true; if(hit.insert( pair(tx+dx[d],ty+dy[d]) ).second == false ){ P("possible"); return 0; } que.push( pair >(d,pair(tx+dx[d],ty+dy[d]) ) ); } } } } } }}} P("impossible"); return 0; }