2021寒假ACM集训队第一次训练-搜索(一)B : 三明治

时间:2021-02-24 12:53:30   收藏:0   阅读:0

B : 三明治 2021-01-17 14:25:53

技术图片

 

 技术图片

  

 

#include<stdio.h>
#include<string.h>//memset(void *s, int v, size_t n)函数的头文件
#include<limits.h>//INT_MAX的头文件 INT_MAX=2147483647  INT_MIN=-2147483648
#define N 405//宏定义
char mp[N][N];//三明治
//n行,m列,
int n, m, res, flag, ans[N][N], vis[N][N]; int fx[]={0,-1,0,1}; int fy[]={-1,0,1,0}; int min(int a, int b){ if (a<=b) return a; else return b; } int check(int x, int y){ return 0<=x && x<n && 0<=y && y<m; } void dfs(int x, int y, int d){ if(vis[x][y]==-1){ flag=1; return; } if(vis[x][y]==1) return; res+=2; vis[x][y]=-1; int p = ((mp[x][y]==N) ? 3:1); if(check( x-fx[d], y-fy[d] )) dfs(x-fx[d], y-fy[d],d); if(check( x-fx[d^p], y-fy[d^p] )) dfs(x-fx[d^p], y-fy[d^p], d^p); vis[x][y]=1; } int main(){ scanf("%d %d", &n, &m); for(int i=0; i<n; ++i) scanf("%s", &mp[i]); for(int i=0; i<n; ++i){ flag = res = 0; memset(vis, 0, sizeof(vis)); for(int j=0; j<m; ++j){ if(!flag) dfs(i,j,2); ans[i][j]=flag ? INT_MAX:res; } flag = res = 0; memset(vis, 0, sizeof(vis)); for(int j=m-1; j>=0; --j){ if(!flag) dfs(i,j,0); ans[i][j]=min(ans[i][j], flag ? INT_MAX:res); } } for(int i=0; i<n; ++i){ for(int j=0; j<m; ++j) printf("%d ", ans[i][j]==INT_MAX ? -1 : ans[i][j]); printf("\n"); } return 0; }

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!