F---图像识别---河南省第十三届ICPC大学生程序设计竞赛

F---图像识别---河南省第十三届ICPC大学生程序设计竞赛_第1张图片

 链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

输入

10 10
........*.
........*.
........*.
........*.
....#...*.
........*.
........*.
**********
........*.
........*.

输出

-4 3

解析:

        遍历整个二维数组,判断坐标原点以及目标点的位置,注意原点在四角上需要特殊判断。

        从坐标原点开始BFS,注意移动的坐标判断。

#include
using namespace std;
typedef long long ll;
const int N=1010;
int n,m,sx,sy,dx,dy,vis[N][N];
char a[N][N];
int f(int x,int y){
	return x>0&&y>0&&x<=n&&y<=m;
}
int dir[4][2]={1,0,0,1,-1,0,0,-1};
struct node{
	int x,y,px,py;
};
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='#') dx=i,dy=j;
			if(a[i][j]=='*'){
				if(i==1&&j==1&&a[i][j+1]=='*'&&a[i+1][j]=='*'){
					sx=1,sy=1;
					break;	
				}
				else if(i==1&&j==m&&a[i][j-1]=='*'&&a[i+1][j]=='*'){
					sx=1,sy=m;
					break;
				}
				else if(i==n&&j==1&&a[i-1][j]=='*'&&a[i][j+1]=='*'){
					sx=n,sy=1;
					break;
				}
				else if(i==n&&j==m&&a[i][j-1]=='*'&&a[i-1][j]=='*'){
					sx=n,sy=m;
					break;
				}
				else{
					int cnt=0;
					for(int k=0;k<4;k++){
						int x=i+dir[k][0];
						int y=j+dir[k][1];
						if(f(x,y)&&a[x][y]=='*') cnt++;
					}
					if(cnt>=3){
						sx=i,sy=j;
						break;
					}
				}
			}
		}
	}
	queueq;
	q.push({sx,sy,0,0});
	vis[sx][sy]=1;
	while(q.size()){
		node t=q.front();
		q.pop();
		if(t.x==dx&&t.y==dy){
			cout<

你可能感兴趣的:(牛客,算法,c++,数据结构,BFS)