地址:
点击打开链接
这个题目是真的-。-。里面还有个大bug。直接做就可以了。
int dir[4][2] = {{0,1},{-1,0},{1,0},{0,-1}};
换成
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
下面对应也改了,那么恭喜你,你就错了!woc这tm什么玩意,写这个代码用了十分钟,找这个bug用了一个多小时????最后还是黑人问号???
正确代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<string.h> #define MAX 650 using namespace std ; int m , n ,num_blocks, sx,sy,sd,block_x,block_y ; int res_x,res_y,res_dir,res_max; int Map[MAX][MAX]; int Vis[MAX][MAX]; int dir[4][2] = {{0,1},{-1,0},{1,0},{0,-1}}; char char_dir ; void dfs(int x , int y , int d ,int step) { if(step>res_max) { res_x = sx; res_y = sy; res_dir = sd; res_max = step; } int tx =x+dir[d][0]; int ty =y+dir[d][1]; if(tx>=0&&tx<m&&ty>=0&&ty<n&&Map[tx][ty]!=1&&Vis[tx][ty]==0) { Vis[tx][ty]=1; dfs(tx,ty,d,step+1); Vis[tx][ty]=0; }else { if(step==0) return ; for(int k = 0 ; k <4 ; k ++) { if(k==d) continue ; tx = x+dir[k][0]; ty = y+dir[k][1]; if(tx>=0&&tx<m&&ty>=0&&ty<n&&Map[tx][ty]!=1&&Vis[tx][ty]==0) { Vis[tx][ty]=1; dfs(tx,ty,k,step+1); Vis[tx][ty]=0; } } } } int main(){ int i , j ,index = 1; while(~scanf("%d%d",&m,&n)&&m+n) { memset(Vis,0,sizeof(Vis)); memset(Map,0,sizeof(Map)); scanf("%d",&num_blocks); while(num_blocks--) { scanf("%d%d",&block_x,&block_y); Map[block_x][block_y] = 1 ; Vis[block_x][block_y] = 1 ; } res_max = 0 ; for(i = 0 ; i <m ; i ++) { for(j = 0 ; j <n ; j ++) { if(Map[i][j]) continue ; Vis[i][j] = 1 ; sx = i ; sy=j ; for(int k = 0 ; k <4 ; k ++) { sd = k ; dfs(i,j,k,0); } Vis[i][j] = 0 ; } } if(res_dir==0) char_dir = 'E'; else if(res_dir==1) char_dir = 'N'; else if(res_dir==2) char_dir = 'S'; else if(res_dir==3) char_dir = 'W'; printf("Case %d: %d %d %d %c\n",index++,res_max+1,res_x,res_y,char_dir); } return 0 ; }