题目大意:
一个王可以向周围8个方格走,如果都不通留在原地,t秒后,他可能存在的位置数
这题数据量过大,我们需要通过奇偶性判断,如果t = 0可以到达,说明 t=2,4,6.。。。都可以到达
所以我这用dp[N][N][2] 来记录x,y位置上奇数和偶数时间分别到达那点的最短时间,如果不存在,用-1表示
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 const int N = 105; 7 int dp[N][N][2],n,t,x,y,vis[N][N]; 8 char mat[N][N]; 9 int dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,-1},{1,1},{-1,1},{-1,-1}}; 10 11 struct Node{ 12 int x,y; 13 Node(int x,int y):x(x),y(y){} 14 }; 15 16 queue<Node> q; 17 18 void bfs() 19 { 20 q.push(Node(x,y)); 21 vis[x][y] = 1; 22 while(!q.empty()){ 23 Node t = q.front(); 24 q.pop(); 25 vis[t.x][t.y]=0; 26 27 for(int i=0;i<8;i++){ 28 int xx = t.x + dir[i][0]; 29 int yy = t.y + dir[i][1]; 30 if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&mat[xx][yy] == '.'){ 31 int flag = 0; 32 if((dp[xx][yy][0] < 0 || dp[xx][yy][0] > dp[t.x][t.y][1] + 1) && dp[t.x][t.y][1] >= 0) 33 { 34 dp[xx][yy][0] = dp[t.x][t.y][1] + 1; 35 flag = 1; 36 } 37 if((dp[xx][yy][1] < 0 || dp[xx][yy][1] > dp[t.x][t.y][0] + 1) && dp[t.x][t.y][0] >= 0) 38 { 39 dp[xx][yy][1] = dp[t.x][t.y][0] + 1; 40 flag = 1; 41 } 42 43 if(flag && !vis[xx][yy]) 44 { 45 vis[xx][yy]=1; 46 q.push(Node(xx,yy)); 47 } 48 } 49 } 50 } 51 } 52 int main() 53 { 54 //freopen("test.in","rb",stdin); 55 //cout << "Hello world!" << endl; 56 int C; 57 scanf("%d",&C); 58 while(C--){ 59 scanf("%d%d%d%d",&n,&t,&x,&y); 60 for(int i=1;i<=n;i++) 61 scanf("%s",mat[i]+1); 62 63 memset(vis,0,sizeof(vis)); 64 memset(dp,-1,sizeof(dp)); 65 dp[x][y][0]=0; 66 67 bfs(); 68 69 int tmp = t&1; 70 int ans = 0; 71 for(int i=1;i<=n;i++){ 72 for(int j=1;j<=n;j++){ 73 if(dp[i][j][tmp]!=-1 && dp[i][j][tmp]<=t) 74 ans++; 75 } 76 } 77 printf("%d ",max(ans,1)); 78 } 79 return 0; 80 }