题意:从起始点经过t步能到达哪些格子,求出所有格子的个数:
思路:1、一步都不能走的时候,为1
2、第n步到达某个格子,则第n+2步也可以到达这里,标记一下,把奇数次偶数次分开就ok了。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int N = 109; char mp[N][N]; int n; bool oor(int x,int y){ if(x<0||x>=n) return false; if(y<0||y>=n) return false; if(mp[x][y]=='#') return false; return true; } int T,sx,sy; struct nod{ int x,y,dis; }; queue<nod> que; int dp[N][N][2]; int dx[]={0,0,-1,-1,-1,1,1,1}; int dy[]={-1,1,-1,0,1,-1,0,1}; void solve() { while(!que.empty()) que.pop(); nod e,t; e.x = sx,e.y = sy;e.dis=0; memset(dp,0,sizeof(dp)); dp[sx][sy][0] = 1; que.push(e); while(!que.empty()) { e = que.front();que.pop(); if(e.dis>=T) break; for(int i=0;i<8;i++) { int tx = e.x+dx[i],ty=e.y+dy[i],d = e.dis+1; if(!oor(tx,ty)) continue; if(dp[tx][ty][d%2]) continue; dp[tx][ty][d%2] = 1; t.x = tx,t.y=ty,t.dis = d; que.push(t); } } int tt = T&1,ans=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(dp[i][j][tt]) { ans++; } ans = max(ans,1); printf("%d\n",ans); } int main() { // freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); while(cas--) { scanf("%d%d%d%d",&n,&T,&sx,&sy); sx--,sy--; for(int i=0;i<n;i++) scanf("%s",mp[i]); solve(); } return 0; }