廣度優先搜索例題(C語言)

**代碼和測試數據都有,可以直接拷貝運行~**

題目:
在這裏插入圖片描述
代碼:
#include <stdio.h>

//全局變量
char a[20][21];

struct node
{
int x;
int y;
};

int getnum(int i,int j)
{
int x,y,sum;
sum=0;

x=i;y=j;
while (a[x][y]!='#') //判斷當前位置是否爲牆
{
	//向上統計
	if (a[x][y]=='G')
	{
		sum++;
	}
	x--;
}

x=i;y=j;
while (a[x][y]!='#') //判斷當前位置是否爲牆
{
	//向下統計
	if (a[x][y]=='G')
	{
		sum++;
	}
	x++;
}

x=i;y=j;
while (a[x][y]!='#') //判斷當前位置是否爲牆
{
	//向左統計
	if (a[x][y]=='G')
	{
		sum++;
	}
	y--;
}

x=i;y=j;
while (a[x][y]!='#') //判斷當前位置是否爲牆
{
	//向右統計
	if (a[x][y]=='G')
	{
		sum++;
	}
	y++;
}
return sum;

}

int main()
{
struct node que[401];//假設地圖大小不超過20*20
int head,tail;
int book[20][21]={0};//定義一個標記數組,1表示該位置已經計算過,0表示還未計算
int n,m,tx,ty,i,j,k,startx,starty;
int sum,max=0,mx,my;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

// n行,m列;初始位置爲startx,starty
scanf("%d %d %d %d",&n,&m,&startx,&starty);

for (i=0;i<=n-1;i++)
{
	scanf("%s",a[i]);//一次讀入一行
}

//隊列初始化
head=1;tail=1;
que[tail].x=startx;
que[tail].y=starty;
tail++;
book[startx][starty]=1;
max=getnum(startx,starty);
mx=startx;
my=starty;

while (head<tail)
{
	for (k=0;k<=3;k++)
	{
		//下一個點位
		tx=que[head].x+next[k][0];
		ty=que[head].y+next[k][1];

		//判斷是否超出邊界
		if (tx<0 || tx>n-1 || ty<0 || tx>m-1)
		{
			continue;
		}

		//判斷是否爲平地或者已經走過
		if (a[tx][ty]=='.' && book[tx][ty]==0)
		{
			book[tx][ty]=1;
			//將新的點位加入到隊列中
			que[tail].x=tx;
			que[tail].y=ty;
			tail++;

			//統計新的點位可消滅的敵人總數
			sum=getnum(tx,ty);
			if (sum>max)
			{
				max=sum;
				mx=tx;
				my=ty;
			}
		}
	}
	head++;//要想得到下一個新的點位,就必須要head++
}
printf("將炸彈放置在(%d,%d)處,最多可以消滅%d個敵人\n",mx,my,max);
return 0;

}

測試數據:

在這裏插入圖片描述

發佈了6 篇原創文章 · 獲贊 4 · 訪問量 355
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章