懒羊羊找朋友

校内测崩了。

一道bfs水题读错题目。

直接广搜,记录答案然后排序。
懒羊羊找朋友(
friend.pas/in/out
问题描述:
最近电视上热播“喜羊羊与灰太狼”,大家都说“做人要做懒羊羊”,为什么呢?因为他
不愿意多做一个动作、不愿意多动一个脑筋,甚至懒得张嘴吃饭,简直是懒的无与伦比!
话说羊村的羊还真多啊!每周一早晨,羊村老村长慢羊羊同志学着人类的学校,把所有
羊列队在广场上进行思想教育,主要是保持警惕防止狼类的攻击,当然也包括对懒羊羊之类
的“异类”进行批评教育。
羊群列队成一个
m*n
的方阵,每只羊站在一个格子里,而且是长期固定的,便于点名啊:)
晕倒!当然,这样一来的好处是,大家都知道自己的朋友站在哪个位置,虽然它们可能互相
看不见,但心里都知道,并且在老村长进行无聊的训教时,大家都还想赶快结束赶快找离自
己最近的朋友交流周末的开心事呢?
懒羊羊也想尽快找到自己的好朋友聊天,但是他既不愿意多走路、又不愿意动脑筋去想
怎么走,所以就请智羊羊同学帮它编个程序,以便快速定位找到离它最近的一位好朋友。
如果你是智羊羊,你怎么完成这个任务呢?
问题输入:
1
行为两个整数
m
n
2<=m,n<=100
第2行为懒羊羊的位置x,y,表示在第x行y列。以下m行为一个m*n的数字方阵,所有a[i,j]的值相等的表示是好朋友,1<=a[i,j]<=100。
每行的两个数之间都有一个空格分隔。
问题输出:
输出一行两个数
x1,y1,表示懒羊羊最近的一个朋友的位置在第x1行y1列,之间用一个空格隔开。如果最近的的朋友不只一个,则输出x1最小的,如果还不唯一则输出y1最小的。数据保证懒羊羊一定有朋友。
输入样例:
4 4
1 2
2 1 2 1
1 3 1 3
2 1 2 2
2
/
4
2 2 1 3
输出样例:
1 4
样例解释:
懒羊羊(1,2)有5个朋友,其中3个朋友(2,1)、(2,3)、(1,4)离它的距离都是
一样的(2),但是其中的x1=1是最小的。
代码:

#include <cstdio>
#include <queue>
#include <algorithm>

using namespace std;

typedef long long int ll;
const int maxn=105;
struct wjz{
int x,y,d;
};
bool cmp(wjz a,wjz b){
if(a.d=b.d){
if(a.x==b.x){
return a.y<b.y;
}
else{
return a.x<b.x;
}
}else{
return a.d<b.d;
}
}
queue<wjz>q;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int n,m;
int a,b,tot;
wjz ans[maxn];
int s[maxn][maxn];
bool vis[maxn][maxn];
int main(){
scanf("%d%d",&n,&m);
scanf("%d%d",&a,&b);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&s[i][j]);
}
}
q.push(wjz{a,b,0});
vis[a][b]=1;
while(!q.empty()){
wjz x=q.front();
q.pop();
for(int i=0;i<4;i++){
int ax=x.x+dx[i],ay=x.y+dy[i];
if((s[ax][ay]==s[a][b])&&(ax!=a||ay!=b)){
ans[++tot].x=ax;ans[tot].y=ay;ans[tot].d=x.d+1;
}
if(!vis[ax][ay]&&ax<=m&&ax>=1&&ay<=n&&ay>=0){
vis[ax][ay]=1;
q.push(wjz{ax,ay,x.d+1});
}
}
}
sort(ans+1,ans+1+tot,cmp);
printf("%d %d ",ans[1].x,ans[1].y);
return 0;
}

原文地址:https://www.cnblogs.com/weijianzhen/p/13345263.html