首页 > 其他分享 >四子连棋(迭代搜索——idfs)

四子连棋(迭代搜索——idfs)

时间:2024-05-26 18:03:27浏览次数:11  
标签:aa 四子 idfs bb int 连棋 && 棋子 步数

四子连棋

题目描述

在一个 4 × 4 4\times 4 4×4 的棋盘上摆放了 14 14 14 颗棋子,其中有 7 7 7 颗白色棋子, 7 7 7 颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

输入格式

从文件中读入一个 4 × 4 4\times 4 4×4 的初始棋局,黑棋子用 B 表示,白棋子用 W 表示,空格地带用 O 表示。

输出格式

用最少的步数移动到目标棋局的步数。

样例 #1

样例输入 #1

BWBO
WBWB
BWBW
WBWO

样例输出 #1

5

思路

这道题对比之前的题,无非就多了要判断是谁下,因为他们两个是轮流下棋的,因此我们dfs的参数要有黑棋坐标,白棋坐标,当前谁下,步数。

拓展:对于步数求法我们有:bfs(结构体)——适用于单操作、dfs(迭代搜索,适用于复杂情形)

代码(更有说服力)

//这种棋盘步数问题也可以用迭代加深来做
//这种双对局的我们往往采取两次idfs

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 15;

int w[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int fx1,fy1,fx2,fy2;
int ans;

bool check(){
    //每行
    for(int i=1;i<=4;i++){
        if(w[i][1]==w[i][2]&&w[i][2]==w[i][3]&&w[i][3]==w[i][4]) return true;
        if(w[1][i]==w[2][i]&&w[2][i]==w[3][i]&&w[3][i]==w[4][i]) return true;
    }
    //对角线
    if(w[1][1]==w[2][2]&&w[2][2]==w[3][3]&&w[3][3]==w[4][4]) return true;
    if(w[1][4]==w[2][3]&&w[2][3]==w[3][2]&&w[3][2]==w[4][1]) return true;
    return false;
}

bool dfs(int u,int x,int y,int xx,int yy,int color){//color就是轮到谁了
    if(u==ans){
        if(check())return true;
        return false;
    }
    
    for(int i=0;i<4;i++){
        int a=x+dx[i],b=y+dy[i];
        int aa=xx+dx[i],bb=yy+dy[i];
        // if(a<1||b<1||a>4||b>4||w[a][b]==color)continue;
        if(a>0&&b>0&&a<=4&&b<=4&&w[a][b]!=color){
            swap(w[a][b],w[x][y]);
            if(dfs(u+1,a,b,xx,yy,(color==1?2:1)))return true;
            swap(w[x][y],w[a][b]);
            
        }
        if(aa>0&&bb>0&&aa<=4&&bb<=4&&w[aa][bb]!=color){
        // if(aa<1||bb<1||aa>4||bb>4||w[aa][bb]==color)continue;
            swap(w[aa][bb],w[xx][yy]);
            if(dfs(u+1,x,y,aa,bb,(color==1?2:1)))return true;
            swap(w[xx][yy],w[aa][bb]);
        }
    }
    
    return false;
}

int main(){
    bool f=false;
    
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            char a;
            cin>>a;
            if(a=='B')w[i][j]=1;//黑棋为1
            else if(a=='W')w[i][j]=2;//白棋为2
            else{
                if(!f){
                    f=true;
                    fx1=i,fy1=j;
                }else{
                    fx2=i,fy2=j;
                }
            }
        }
    }

    //直接枚举步数——一般这些步数都很少的
    for(ans=0;ans<=0x3f3f3f3f;ans++){
        if(dfs(0,fx1,fy1,fx2,fy2,1))break;
        if(dfs(0,fx1,fy1,fx2,fy2,2))break;
    }
    
    cout<<ans;
    
    return 0;
}

标签:aa,四子,idfs,bb,int,连棋,&&,棋子,步数
From: https://blog.csdn.net/m0_60738889/article/details/139201151

相关文章

  • mongo GridFSBucket
    1、描述:mongo  单机使用 GridFSBucket2、pox中添加jar<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.12.9</version></dependency>3、module中使用,直接上代码 3.1......
  • 【C 语言基础】get四子——getc()、getchar()、getch() 和 getche() 的区别
    所有这些函数都从输入中读取一个字符并返回一个整数值。返回整数以容纳用于指示失败的特殊值。EOF值通常用于此目的。1.getc()    它从给定的输入流中读取单个字符,并在成功时返回相应的整数值(通常是读取字符的ASCII值)。失败时返回EOF。    语法:intgetc(FILE*stream)......
  • GridFS上传&下载文件
     首先我们先说上传文件到GridFs;上传文件到GridFs上相对比较简单,只需要GridFsTemplate的store方法;    1.上传文件        如果文件为String类型则我们需要将其转化为inputstream的流对象,然后在调用store方法,如果需要返回字符串类型则可以使用tostring方法;InputStre......
  • 无涯教程-MongoDB - GridFS
    GridFS是MongoDB规范,用于存储和检索大文件,例如图像,音频文件,视频文件等,它是一种文件系统,用于存储文件,但其数据存储在MongoDB集合中。GridFS能够存储甚至超过其文档大小限制16MB的文件。GridFS将文件分为多个块,并将每个数据块存储在单独的文档中,每个文件的最大大小为255k。默......
  • springboot 整合 gridfs 、webUploader实现大文件分块上传、断点续传、秒传
    主要的pom.xml:<dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>    </dependency><!--mongodb-->    <dependency>      <groupId>org.spri......
  • 使用 MongoDB 的兄弟,有没有采用 GridFS 做分布式文件系统的?
    修改写补充说明郭理靖,京东开放平台邓涛、Kenny、李波等人赞同压力以及数据量比较大的业务不推荐使用MongoGridFS。MongoGridFS在高并发(每秒写入10M,持续半小时到一个小时)的情况下secondary会无法catchupwithprimary。MongoGridFS不是为分......
  • pythongridFS
    PythonGridFS:用于存储和检索大文件的Python库![gridfs_logo](简介PythonGridFS是一个基于Python的库,用于在MongoDB数据库中存储和检索大文件。MongoDB是一个流行的文档型NoSQL数据库,它提供了GridFS作为一个标准的文件系统存储解决方案。GridFS可以处理超出MongoDB文档大小限制......
  • 解决MongoDB之Gridfs的具体操作步骤
    MongoDB之GridFS什么是GridFSGridFS是MongoDB的一种存储文件的方式,它可以用于存储和检索大型文件。在传统的MongoDB中,适合存储的文件大小通常限制在16MB以内,而GridFS可以突破这个限制,支持存储非常大的文件。GridFS将大文件分割为小块,每个小块都被存储为一个MongoDB文档。同时,Gri......
  • nginx-gridfs Benchmarking Raw Results
    RawDataSpreadsheetwithtestresults(ODFformat)Thesefollowinglinksshowtherawoutputfromthebenchmarkingutilities.GridFSOverNetworkThistestscenarioshowsperformanceforHTTPrequestsoveragigabitEthernetLANconnection.MongoDBand......
  • MongoDB C++ gridfs worked example
    使用libmongoc,参考:http://mongoc.org/libmongoc/current/mongoc_gridfs_t.html#include<mongoc.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>classMongoGridFS{public:MongoGridFS(constchar*db);~MongoGridFS();......