邱老师降临小行星(UESTC 1086)

来源:互联网 发布:网络打印机 脱机 处理 编辑:程序博客网 时间:2024/04/28 06:30

记忆化搜索,每个格子对应4(方向)*2(向左还是向右转)共8种标记。

#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<vector>#include<list>#include<algorithm>using namespace std;char a[1010][1010];int book[1010][1010][4][2];int n,m;int d[4][2] = {-1,0,1,0,0,-1,0,1};//直走 //0:N 1:S 2:W 3:E 面向 //0:L 1:Rint q[4][2][2] = {0,-1,0,1,0,1,0,-1,1,0,-1,0,-1,0,1,0};//坐标 int t[4][2] = {2,3,3,2,1,0,0,1};//方向 int dfs(int x,int y,int p,int s);int judge(int x,int y);int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);getchar(); for(int i=0;i<n;i++){scanf("%s",a[i]);}int ans = 0;memset(book,-1,sizeof(book));for(int i=0;i<n;i++){//对每一个格子进行搜索 for(int j=0;j<m;j++){int temp = 1;if(a[i][j]=='1'){for(int k=0;k<4;k++){//四个方向 temp += dfs(i+d[k][0],j+d[k][1],k,1);}ans = max(ans,temp);}}}printf("%d\n",ans);}return 0;}int judge(int x,int y){if(x>=0&&x<n&&y>=0&&y<m)return 1;return 0;}int dfs(int x,int y,int p,int s){int ans = 0;if(judge(x,y)&&a[x][y]=='1'){if(book[x][y][p][s]!=-1){//若已经搜索过,则不用再搜了 return book[x][y][p][s];}else{ans = dfs(x+q[p][s][0],y+q[p][s][1],t[p][s],(s+1)%2) + 1;//注意加当前格子 if(judge(x,y)){book[x][y][p][s] = ans;return ans;}}}return 0;}


0 0
原创粉丝点击