首页 > 代码库 > HDU 4478 Where is King
HDU 4478 Where is King
题目大意:
一个王可以向周围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 }
HDU 4478 Where is King
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。