此题是道bfs搜索的题目。bfs的精髓就是找到下一步的所有可能然后存储起来,有点暴力的感觉,这题就是每步中 所有的可能都入队,然后一一 判断。这道题的题意是 :
给你一幅完全图,再给你三个盘,目的是把这三个盘移动到一个点上,输出最少步数!盘移动的时候有要求,比如移第一个盘,把1盘移动到2这个位置,(1,2)这个点有颜色标记,另外两个盘比如说在3,4两点,那么1盘能移动到2这个点的条件是(1,2)这个点的颜色要与(3,4)这点的颜色相同!!
#include"iostream"#include"stdio.h"#include"algorithm"#include"string.h"#include"cmath"#include"string"#include"queue"#define mx 105using namespace std;int n,p1,p2,p3;struct node{ int p[3]; int step;};char g[mx][mx];bool vis[mx][mx][mx];//标记某种情况是否已出现过void Set(node a){ vis[a.p[0]][a.p[1]][a.p[2]]=false;}bool judge(node a) //判断此情况是否已出现过{ return vis[a.p[0]][a.p[1]][a.p[2]];}bool End(node a) //判断是否完成操作{ if(a.p[0]==a.p[1]&&a.p[1]==a.p[2]) return true; return false;}void bfs(){ queueq; while(!q.empty()) q.pop(); node cur,next; cur.p[0]=p1;cur.p[1]=p2;cur.p[2]=p3;cur.step=0; q.push(cur); Set(cur); int i; while(!q.empty()) { cur=q.front(); q.pop(); if(End(cur)) { cout< < >n,n) { memset(vis,true,sizeof(vis)); cin>>p1>>p2>>p3; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>g[i][j];//用于单个字符的输入,不会读入空格,以前一直误以为会连空格一起读入 } } bfs(); } return 0;}