博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 题解 P1225 【黑白棋游戏】
阅读量:6830 次
发布时间:2019-06-26

本文共 3234 字,大约阅读时间需要 10 分钟。

看见很多dalao写了什么双向BFS,蒟蒻表示不会写啊。

怎么办办?

先来分析一下题目,一眼看去就是一个搜索题,考虑DFS与BFS。

先放一份DFS的代码:

#include
using namespace std;bool a[5][5],b[5][5];char c;int dx[5]={0,0,0,1,-1};int dy[5]={0,1,-1,0,0};int ans=0x3f3f3f3f;int ax[110],bx[110],ay[110],by[110];int ansx1[110],ansx2[110],ansy1[110],ansy2[110];int cnt=0,ans_cnt;map
mp;inline string get(){ string s=""; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++)s+=a[i][j]+'0'; return s;}inline bool check(){ for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) if(a[i][j]!=b[i][j])return 0; return 1;}inline void DFS(int x,int y,int tot){ /*for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++)cout<
=ans)return; if(check()) { ans=tot; ans_cnt=cnt; for(int i=1;i<=cnt;i++) { ansx1[i]=ax[i]; ansx2[i]=bx[i]; ansy1[i]=ay[i]; ansy2[i]=by[i]; } } if(y==5)return; if(x==5)x=1,y++; /*string s=get(); cout<
<
4||bb<1||bb>4||a[aa][bb]==a[x][y])continue; cnt++; ax[cnt]=x;ay[cnt]=y; bx[cnt]=aa;by[cnt]=bb; swap(a[aa][bb],a[x][y]); DFS(x+1,y,tot+1); cnt--; swap(a[aa][bb],a[x][y]); }}int main(){ for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>c; if(c=='1')a[i][j]=1; else a[i][j]=0; } for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>c; if(c=='1')b[i][j]=1; else b[i][j]=0; } DFS(1,1,0); cout<
<

这里枚举每一个点,进行上下左右的交换。看上去很(fei)有(chang)道(che)理(dan)的样子,但是很明显,有时候交换完下面的点还可以去交换上面的点,所以有时候会搜不到答案,只能拿到60分

蓝题能拿60分也很不错了呢

怎么办办?

那么当然要用BFS啦,(蒟蒻不会记录方案的好办法,只能暴力存储啦)

#include
using namespace std;bool a[5][5],b[5][5];char c;int dx[5]={0,0,0,1,-1};int dy[5]={0,1,-1,0,0};//上下左右int ans=0x3f3f3f3f;int ansx1[100],ansx2[100],ansy1[100],ansy2[100];map
mp;//剪枝专用struct Node{ bool cc[5][5];//记录当前局势 int tot;//记录总数 int x1[20],x2[20],y1[20],y2[20];//记录方案};inline void BFS(){ queue
q; Node now; now.tot=0; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) now.cc[i][j]=a[i][j];//把局势copy一份 q.push(now); while(q.size()) { Node now=q.front(); /*for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++)cout<
4||bb>4||now.cc[i][j]==now.cc[aa][bb])continue;//超过边界或为相同数字,那么就continue swap(next.cc[aa][bb],next.cc[i][j]);//交换 next.x1[next.tot]=i;next.y1[next.tot]=j; next.x2[next.tot]=aa;next.y2[next.tot]=bb;//添加新方案 q.push(next); swap(next.cc[aa][bb],next.cc[i][j]);//回溯 } } } }}int main(){ for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>c; if(c=='1')a[i][j]=1; else a[i][j]=0; } for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>c; if(c=='1')b[i][j]=1; else b[i][j]=0; } BFS(); cout<
<

转载于:https://www.cnblogs.com/hulean/p/11056741.html

你可能感兴趣的文章
SCCM 2007r2 操作系统播发故障处理案例三
查看>>
Linux网站架构系列之Apache----进阶篇
查看>>
Cisco ASA Failover配置实例 ZZ
查看>>
网络防火墙的配置与管理
查看>>
【桌面虚拟化】之五PCoIP
查看>>
游侠原创:安全狗“服云”深度评测!
查看>>
Linux内核高性能优化【生产环境实例】
查看>>
Windows Server 2016 和Windows 10的中Hyper-V虚拟机生产检查点
查看>>
Expression Blend使用笔刷
查看>>
思科交换机端口安全
查看>>
Silverlight C# 游戏开发:L6 3D摄像机
查看>>
XML和XMLSocket(一) -- XML的基础知识
查看>>
[强烈推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!)
查看>>
Struts知识问答
查看>>
MongoDB实战(4)MapReduce
查看>>
FTP自动化上传的Shell脚本
查看>>
【C++11 并发编程教程 - Part 3 : 锁的进阶与条件变量(bill译)】
查看>>
换Vista啦
查看>>
jsp 教程(一)
查看>>
【移动开发】Android中异步加载数据(二)AsyncTask异步更新界面
查看>>