蓝桥杯全球变暖程序错误

蓝桥杯全球变暖程序错误,用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行 =“.”是赋值,用==

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/386122
  • 你也可以参考下这篇文章:解决词梯问题之宽度优先级算法及图解(BFS)--(数据结构与算法7)
  • 除此之外, 这篇博客: 【蓝桥杯】历届试题 九宫重排(广度优先搜索bfs)中的 历届试题 九宫重排 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    问题描述
    如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。
    Alt
    我们把第一个图的局面记为:12345678.
    把第二个图的局面记为:123.46758
    显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
    本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。
    如果无论多少步都无法到达,则输出-1。

    输入格式
    输入第一行包含九宫的初态,第二行包含九宫的终态。

    输出格式
    输出最少的步数,如果不存在方案,则输出-1。

    样例输入
    12345678.
    123.46758

    样例输出
    3

    样例输入
    13524678.
    46758123.

    样例输出
    22





    分析:
    本题和“

    历届试题 青蛙跳杯子”同属一种类型
    都是给出一个初态和一个目标态,让我们输出从初态转变为目标态所需的最小步数
    不同的是,在“历届试题 青蛙跳杯子”这道题中,我们处理的字符串在发生位置交换时是一个一维的变换(只有向左或向右,则对应用加或减来刻画即可),并且对于所有位置上都通用,于是可以设置一个dir[]数组,在里面存放所有的位置变换操作即可;而在本题中,由于给出的是一个九宫格,因此在处理字符串发生位置交换时是一个二维的变换(此时有上、下、左、右四个方向的变换)。于是在这里就引出了一个新问题:每个点位置变换时并不一致,我们如何处理。如下所示:
    Alt
    我们可以发现:
    与格点0直接相邻的点有格点1和格点3(与之类似的还有格点2、格点6、格点8)
    与格点1直接相邻的点有格点0、格点2和格点4(与之类似的还有格点3、格点5、格点7)
    与格点4直接相邻的点有格点1、格点3、格点5和格点7

    这时我们换一种思路,把这个九宫格视为一个长度为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来对整个初始字符串进行搜索即可




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^