首页 > 其他分享 >POJ 1753 Flip Game(bfs枚举+递推)

POJ 1753 Flip Game(bfs枚举+递推)

时间:2023-04-13 21:38:13浏览次数:38  
标签:f1 f2 int Flip bfs Game ans min1 include


题目地址:http://poj.org/problem?id=1753

这题此前曾经做过,但当时是用的纯BFS做的,然后后来又做了一次组队赛,那是16*16的,果断超时超内存。。能超的都超了。。于是又找了个更好的方法,就是枚举第一行,然后后面的根据第一行的情况推下去。比如,你要让所有的都变成W,如果上一行的对应位置是B的话,那它就必须要翻转。这样能保证前三行的都是W,然后只需判断最后一行就可以判断是不是全翻成了W。代码如下:


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>

using namespace std;
int mp[20], min1, ff=0;
struct node
{
    int a[20], x, ans;
};
void bfs()
{
    int i, j;
    min1=1000000;
    queue<node>q;
    node f1, f2;
    for(i=0; i<16; i++)
    {
        f1.a[i]=mp[i];
    }
    f1.x=0;
    f1.ans=0;
    q.push(f1);
    while(!q.empty())
    {
        f1=q.front();
        q.pop();
        if(f1.x==4)
        {
            int ans1=0, ans2=0, flag=0;
            for(i=0; i<16; i++)
            {
                f2.a[i]=f1.a[i];
            }
            f2.ans=f1.ans;
            for(i=4; i<16; i++)
            {
                if(f2.a[i-4]==0)
                {
                    f2.a[i-4]=1-f2.a[i-4];
                    f2.a[i]=1-f2.a[i];
                    if(i%4>0)
                        f2.a[i-1]=1-f2.a[i-1];
                    if(i%4<3)
                        f2.a[i+1]=1-f2.a[i+1];
                    if(i+4<16)
                        f2.a[i+4]=1-f2.a[i+4];
                    ans1++;
                }
            }
            for(i=12; i<16; i++)
            {
                if(f2.a[i]==0)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                if(min1>f2.ans+ans1)
                    min1=f2.ans+ans1;
                ff=1;
            }
            for(i=0; i<16; i++)
            {
                f2.a[i]=f1.a[i];
            }
            f2.ans=f1.ans;
            flag = 0;
            for(i=4; i<16; i++)
            {
                if(f2.a[i-4]==1)
                {
                    f2.a[i-4]=1-f2.a[i-4];
                    f2.a[i]=1-f2.a[i];
                    if(i%4>0)
                        f2.a[i-1]=1-f2.a[i-1];
                    if(i%4<3)
                        f2.a[i+1]=1-f2.a[i+1];
                    if(i+4<16)
                        f2.a[i+4]=1-f2.a[i+4];
                    ans2++;
                }
            }
            for(i=12; i<16; i++)
            {
                if(f2.a[i]==1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                if(min1>f2.ans+ans2)
                    min1=f2.ans+ans2;
                ff=1;
            }
            continue ;
        }
        for(i=0; i<16; i++)
        {
            f2.a[i]=f1.a[i];
        }
        f2.x=f1.x+1;
        f2.ans=f1.ans;
        q.push(f2);
        f2.a[f1.x]=1-f1.a[f1.x];
        if(f1.x>=1)
        {
            f2.a[f1.x-1]=1-f1.a[f1.x-1];
        }
        if(f1.x<3)
        {
            f2.a[f1.x+1]=1-f1.a[f1.x+1];
        }
        f2.a[f1.x+4]=1-f1.a[f1.x+4];
        f2.ans=f1.ans+1;
        q.push(f2);
    }
}
int main()
{
    char s[10];
    int i, j;
    for(i=0; i<4; i++)
    {
        scanf("%s",s);
        for(j=0; j<4; j++)
        {
            if(s[j]=='w')
                mp[4*i+j]=1;
            else
                mp[4*i+j]=0;
        }
    }
    bfs();
    if(ff)
        printf("%d\n",min1);
    else
        printf("Impossible\n");
    return 0;
}



标签:f1,f2,int,Flip,bfs,Game,ans,min1,include
From: https://blog.51cto.com/u_16070138/6188409

相关文章

  • GAMES101笔记-01
    前言:这篇以及未来的一系列随笔是根据b站上的GAMES101现代计算机图形学入门课程所写的笔记,但笔记的篇章并非和课程一一对应。比如这篇对应的是第二课~第三课的内容。并且整理时不一定会将推导过程全部列出,做成只有总结概括的内容也不是没有可能。 1.向量叉乘的矩阵表示:  ......
  • 天梯赛练习题 L3-008 喊山(bfs)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805050709229568输入样例:75412233145561457输出样例:2640#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAX......
  • 天梯赛练习题 L3-004 肿瘤诊断(bfs)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805052626026496输入样例:3452111111111111001100110011101101000000101100000000000100011000输出样例:26LLdz[]={1,-1,0,0,0,0},dx......
  • spfa求最短路——BFS,数组实现邻接表,数组实现队列
    题目描述题目来源AcWing给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个......
  • 通过MenuItem在场景中生成GameObject
    MenuItemAttribute允许你在主菜单中添加新的选项。而这个菜单选项来自于一个静态函数。publicclassTestMenuItem{//Createsanewmenuitem'Examples>CreatePrefab'inthemainmenu.[MenuItem("TestMenuItem/CreatePrefab")]staticvoidCreatePrefa......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(2)
    课程顺序题目现在总共有numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i]=[ai,bi] 表示想要学习课程ai ,需要先完成课程bi 。请根据给出的......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(1)
    计算除法题目给定一个变量对数组equations和一个实数值数组values作为已知条件,其中equations[i]=[Ai,Bi]和values[i]共同表示等式Ai/Bi=values[i]。每个Ai或Bi是一个表示单个变量的字符串。另有一些以数组queries表示的问题,其中queries[j]=[Cj,Dj]......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • JumpGame
    packageDynamicPlanning;/***55.跳跃游戏*给定一个非负整数数组nums,你最初位于数组的第一个下标。*数组中的每个元素代表你在该位置可以跳跃的最大长度。*判断你是否能够到达最后一个下标。*//***设想一下,对于数组中的任意一个位置y,我们如何判断它是......
  • python-Pygame 小游戏开发
    AIServoPlatformThisProjectisbaseontheraspberryhardwareplatformwhichbeusedforautomaticfacetrackandalsopersontrackfiledinthefuture.AITech.RaspberryProgramming.HardwareUpdate.1.StoveControlCodeimportpygamefrompygame.lo......