迷宫问题,先使用一个floodfill算法(本人写法不一样,不过是floodfill算法的思想),然后直接循环查出答案,使用位运算判断方向,独立完成,较有成就感 #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<queue> #include<vector> using namespace std; ifstream fin("castle.in"); ofstream fout("castle.out"); struct node{ int x,y; node(){} node(int a,int b){x=a,y=b;} }; node que[100000]; int n,m; unsigned int wall[51][51]; unsigned int vis[51][51]; int brick_num[2600]; int wall_num; int wall_max; int mov[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int dir[4]={1,2,4,8}; int res_max=-1,res_x,res_y; char res_dir; void count(); void bfs(int x,int y); void solve(); int main(){ fin>>n>>m; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ fin>>wall[i][j]; } } wall_num=0;wall_max=-1; memset(vis,0,sizeof(vis)); count(); solve(); /* for(int i1=0;i1<m;i1++){ for(int j1=0;j1<n;j1++){ fout<<vis[i1][j1]<<" "; } fout<<endl; } */ fout<<wall_num<<endl; fout<<wall_max<<endl; fout<<res_max<<endl; fout<<res_x+1<<" "<<res_y+1<<" "<<res_dir<<endl; return 0; } void count(){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(vis[i][j]==0){ wall_num++; bfs(i,j); } } } } void bfs(int x,int y){ int front,rear,brick; front=rear=0; node a(x,y); que[rear++]=a; vis[x][y]=wall_num; brick=1; while(front!=rear){ node now=que[front++]; unsigned int walltemp=~wall[now.x][now.y]; for(int i=0;i<4;i++){ if(walltemp&dir[i]){ int tx=now.x+mov[i][0]; int ty=now.y+mov[i][1]; if(tx>=0 && tx<m && ty>=0 && ty<n && vis[tx][ty]==0){ vis[tx][ty]=wall_num; brick++; node b(tx,ty); que[rear++]=b; } } } } if(brick>wall_max) wall_max=brick; brick_num[wall_num]=brick; } void solve(){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i-1>=0 && vis[i-1][j]!=vis[i][j]){ int t_max=brick_num[vis[i][j]]+brick_num[vis[i-1][j]]; if(t_max>res_max ){ res_max=t_max; res_x=i,res_y=j; res_dir='N'; } else if(t_max==res_max && j<=res_y && i>=res_x) { res_max=t_max; res_x=i,res_y=j; res_dir='N'; } } if(j+1<n && vis[i][j+1]!=vis[i][j]){ int t_max=brick_num[vis[i][j]]+brick_num[vis[i][j+1]]; if(t_max>res_max ){ res_max=t_max; res_x=i,res_y=j; res_dir='E'; } else if(t_max==res_max && j<=res_y && i>=res_x) { res_max=t_max; res_x=i,res_y=j; if(j==res_y&&i==res_x){} else res_dir='E'; } } } } }