蓝桥杯全球变暖程序错误,用bfs的,pd用来判断四周有没有#点
#include
#include
#include
using namespace std;
char dp[100][100]={0};
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int n;
int pd[100][100]={0};
int sum=0;
typedef pair<int,int> PII;
queue q;
void bfs(int xx,int yy)
{
q.push((PII){xx,yy});
while(!q.empty())
{
int t1=q.front().first,t2=q.front().second;
q.pop();
if(dp[t1][t2]='.')
pd[t1][t2]=1;
else if(dp[t1][t2]='#')
{
for(int i=0;i<4;i++)
{
int tx=t1+dx[i],ty=t2+dy[i];
if(dp[tx][ty]=='.') pd[t1][t2]=1;
if(tx>n||ty>n||tx<1||ty<1) continue;
if(pd[t1][t2]==1) break;
}
}
if(t1+1<=n&&t2<=n&&pd[t1+1][t2]==0)q.push((PII){t1+1,t2});
if(t2+1<=n&&t1<=n&&pd[t1][t2+1]==0)q.push((PII){t1,t2+1});
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(pd[i][j]==0) sum++;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>dp[i][j];
bfs(1,1);
cout<// 请在此输入您的代码
return 0;
}
21,23行 =“.”是赋值,用==
不知道你这个问题是否已经解决, 如果还没有解决的话:问题描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。
如果无论多少步都无法到达,则输出-1。
输入格式
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出格式
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
样例输入
13524678.
46758123.
样例输出
22
分析:
本题和“
这时我们换一种思路,把这个九宫格视为一个长度为9的字符串(降维至一维):012345678
此时再把这字符串上每个位置能直接移动过去的点都放进一个数组dir[ ][ ]中,如:
在点0处能移动至点1和点3,则dir[0][0]=1,dir[0][1]=3
在点1处能移动至点0、点2和点4,则dir[1][0]=0,dir[1][1]=2,dir[1][2]=4
在点4处能移动至点1、点3、点5和点7,则dir[4][0]=1,dir[4][1]=3,dir[4][2]=5,dir[4][3]=7
……
由于从上图的结论中我们知道,在九宫格中主要有三类点,一类的直接相邻点为2,一类为3,还有一个为4。因此为了在程序中能更方便使用dir[ ][ ],我们还需要为每个出发点设置好其可移动方案的数量,这里可以再次定义一个dirCount[ ]数组来存放,如:
在点0处能移动至其他两个点,则dirCount[0]=2
在点1处能移动至其他三个点,则dirCount[1]=3
在点4处能移动至其他四个点,则dirCount[4]=4
……
当解决了上述问题后,这道题就和历届试题 青蛙跳杯子一样了
接下来只需要利用bfs来对整个初始字符串进行搜索即可