1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include <bits/stdc++.h> #define debug(x) cerr<<#x<<":"<<x<<"\n";
using namespace std;
using ll = long long; constexpr ll mod=998244353;
ll dp[1100][105][105]; bool danger[1100][105][105]; ll dx[]={1,2,2,-1,-2,1,-1,-2}; ll dy[]={2,1,-1,2,1,-2,-2,-1}; ll bx[]={0,1,1, 0,-1,0,0,-1}; ll by[]={1,0,0, 1,0,-1,-1,0}; ll di[]={0,1}; ll dj[]={1,0}; inline void solve(){ ll N,M; cin>>N>>M; vector<array<ll,2> > ma; for(int i=0;i<M;++i){ ll x,y; cin>>x>>y; ma.push_back({x,y}); } ll cnts=(1<<M); for(int s=0;s<=cnts;++s){ bitset<15> bi(s); vector<array<ll,2> > wp; set<array<ll,2> > st; for(int i=0;i<M;++i){ if(bi[i]){ wp.push_back(ma[i]); st.insert(ma[i]); } } for(int i=0;i<wp.size();++i){ ll x=wp[i][0],y=wp[i][1]; for(int j=0;j<8;++j){ ll u=x+dx[j],v=y+dy[j]; if(u<0 || u>N) continue; if(v<0 || v>N) continue; ll bbx=x+bx[j],bby=y+by[j]; if(st.find({bbx,bby})!=st.end()) continue; danger[s][u][v]=true; } } } if(!danger[cnts-1][0][0]) dp[cnts-1][0][0]=1; for(int s=cnts-1;s>=0;--s){ for(int i=0;i<=N;++i){ for(int j=0;j<=N;++j){ if(danger[s][i][j]) continue; bitset<15> bi(s); set<array<ll,2> > mas; for(int k=0;k<M;++k){if(bi[k]) mas.insert(ma[k]);} for(int k=0;k<2;++k){ ll u=i+di[k],v=j+dj[k]; if(u<0 || u>N) continue; if(v<0 || v>N) continue; if(danger[s][u][v]) continue; if(mas.find({u,v})!=mas.end()){ ll idx=0; for(int l=0;l<M;++l){ if(ma[l][0]==u && ma[l][1]==v){idx=l;break;} } if(danger[s-(1<<idx)][u][v]) continue; dp[s-(1<<idx)][u][v]+=dp[s][i][j]; dp[s-(1<<idx)][u][v]%=mod; }else{ dp[s][u][v]+=dp[s][i][j]; dp[s][u][v]%=mod; } } } } } ll ans=0; for(int s=cnts-1;s>=0;--s){ ans+=dp[s][N][N]; ans%=mod; } if(ans<0) ans+=mod; cout<<ans<<"\n"; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); solve(); return 0; }
|