题目大意:

一个王可以向周围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\n",max(ans,1));
78     }
79     return 0;
80 }

 

 posted on 2014-10-19 00:15  Love风吟  阅读(191)  评论(0编辑  收藏  举报