博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codevs1044四子连棋(Dfs)
阅读量:5259 次
发布时间:2019-06-14

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

/*数据范围太小 暴力暴力 Dfs直接 终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了 搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样所以 维护一个b 表示这一步走那种颜色  b=1先走白棋 b=2先走黑棋 */#include
#include
#include
using namespace std;int xx[5]={
0,0,0,1,-1};//枚举四个方向 int yy[5]={
0,1,-1,0,0};int g[5][5],minn=1000;//最小步数 char s;void Dfs(int x,int y,int num,int b)//b表示 先走那种颜色 { int m=100000,i,j,k; if(num>=minn) return; //剪枝 如果已经比目前的最优解大了 就不用再Dfs了 for(i=1;i<=4;i++)//4种目标棋局一一列举 如果有符合的 更新m的值 { if(g[i][1]==g[i][2]&&g[i][2]==g[i][3]&&g[i][3]==g[i][4]&&(g[i][4]==1||g[i][4]==2))m=num; if(g[1][i]==g[2][i]&&g[2][i]==g[3][i]&&g[3][i]==g[4][i]&&(g[4][i]==1||g[4][i]==2))m=num; } if(g[1][1]==g[2][2]&&g[2][2]==g[3][3]&&g[3][3]==g[4][4]&&(g[4][4]==1||g[4][4]==2))m=num; if(g[4][1]==g[3][2]&&g[3][2]==g[2][3]&&g[2][3]==g[1][4]&&(g[1][4]==1||g[1][4]==2))m=num; if(m
0&&ox<=4&&oy>0&&oy<=4&&g[ox][oy]==b) { g[x][y]=g[ox][oy]; g[ox][oy]=0;//走完之后g[ox][oy]变空 g[x][y]变g[ox][oy] if(b==1)b=2;//黑白交替走 上次走黑 下次走白 else b=1; for(j=1;j<=4;j++)//因为空格又不止一个 所以 找空格0.0 for(k=1;k<=4;k++) if(!g[j][k])//空 Dfs(j,k,num+1,b); g[ox][oy]=g[x][y];//回溯 g[x][y]=0; if(b==1)b=2; else b=1; } }}int main(){ int i,j; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { cin>>s; if(s=='W')g[i][j]=1;//白棋 if(s=='B')g[i][j]=2;//黑棋 } for(i=1;i<=4;i++) for(j=1;j<=4;j++) if(!g[i][j])//空格 { Dfs(i,j,0,1);//先走白棋 Dfs(i,j,0,2);//先走黑棋 } cout<
<

 

转载于:https://www.cnblogs.com/yanlifneg/p/5424129.html

你可能感兴趣的文章
python:从迭代器,到生成器,再到协程的示例代码
查看>>
Java多线程系列——原子类的实现(CAS算法)
查看>>
在Ubuntu下配置Apache多域名服务器
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>