翻牌回朔法解题

#include <cstdlib>
#include <iostream>

using namespace std;
class card{
     private:
             int a[5][5];//原题
             int b[5][5];//解决方案
             int c[5][5];//桥
             int s[5][5];//结果串
             int counts;//解数目
     public:
             card (char x[25]);
             void Backtrack (int t);
             bool Constraint(int t);
             bool Bound (int t);
             bool Solution();
             void Output();
             void turn(int i,int j);
             void IfnoSolution();
};

int main(int argc, char *argv[])
{

    char s[25];
    cout<<"请输入5X5的零一矩阵"<<endl;
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
               s[i*5+j]=getchar();
        }
        getchar();
    }

    card cd(s);

    cd.Backtrack(1);
    cd.IfnoSolution();
    system("PAUSE");
    return EXIT_SUCCESS;
}
void card::Backtrack(int t){
     if (t > 25 ){//到达叶节点
         Output();
     }
     else{
         for (int i = 0;i<=1;i++){
              b[t/5][t%5-1] = i;
              Backtrack(t+1);
         }
     }
}

card::card(char x[25]){
       cout<<"题目:"<<endl;
       for(int i=0;i<5;i++){
           for(int j=0;j<5;j++){
                a[i][j]=x[i*5+j]-48;
                cout<<a[i][j];
           }

           cout<<endl;
       }
       counts=0;
       cout<<endl;
}

bool card::Constraint (int t){
     ;
}

bool card::Bound (int t){
     ;
}

bool card::Solution(){
     for(int i=0;i<5;i++){
           for(int j=0;j<5;j++){
                c[i][j]=a[i][j];
           }
     }
     for(int i=0;i<5;i++){
             for(int j=0;j<5;j++){
                 if(b[i][j]==1){
                       turn(i,j);
                 }
             }
     }
     for(int i=0;i<5;i++){
             for(int j=0;j<5;j++){
                  if(c[i][j]==1){
                        return false;//只要有一个就错
                  }
             }
     }
     counts++;
     return true;
}

void card::Output(){
     if(Solution()){
       cout<<"解"<<counts<<":"<<endl;
       for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                 s[i][j]=b[i][j];
                 cout<<s[i][j];
            }
            cout<<endl;
       }
       cout<<endl;
     }
}

void card::IfnoSolution(){
     if(counts==0)cout<<"无解!"<<endl;
}

void card::turn(int i,int j){
         if(c[i][j]==0) c[i][j]=1;
              else c[i][j]=0;
         if(i>0){
            if(c[i-1][j]==0) c[i-1][j]=1;
              else c[i-1][j]=0;
         }
         if(i<4){
            if(c[i+1][j]==0) c[i+1][j]=1;
              else c[i+1][j]=0;
         }
         if(j>0){
            if(c[i][j-1]==0) c[i][j-1]=1;
              else c[i][j-1]=0;
         }
         if(j<4){
            if(c[i][j+1]==0) c[i][j+1]=1;
              else c[i][j+1]=0;
         }
}

  

时间: 2024-11-08 21:42:21

翻牌回朔法解题的相关文章

回朔法求数独

你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一的,所以,多个解也称为无解. 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目.但对会使用计算机编程的你来说,恐怕易如反掌了. 本题的要求就是输入数独题目,程序输出数独的唯一解.我们保证所有已知数据的格式都是合法的,并且题目有唯一的解. 格式要求,输入9行,每行9个数字,0代表未知

回朔法/KMP算法-查找字符串

回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false:这种方法简单粗暴,但思路清晰.又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法. KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串.然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的

【经典算法】回朔法

回溯是遍历所有搜索空间所有可能组态的方法.这些组态也许代表对象的所有排列或这是构建对象集合的所有可能的方法(子集).其他情况包括列举一个图的所有生成树,两个节点的所有路径或是把节点分类成不同颜色的所有不同的方式. 这些问题有一个共同的难点就是我们必须每次产生一个可能的组态.避免重复或遗漏组态的方法就是我们必须定义一个系统性的产生组态的顺序.我们把组合搜索解作为一个向量a=(a1,a2,...,an),向量元素ai来自有限子集S.这样的向量也许表示一个序列,元素ai是排列的第i个元素.或者,向量表

递归之回朔算法应用----八皇后问题

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生.哈哈 开个玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.

一种基于匹配回朔的 css3 选择器引擎实现

介绍 CSS 选择器是一种应用于 DOM 节点查找场景的特定微型语法, 本质上和正则表达式一样都是一种模式匹配语言,灵活使用可以方便得获取指定位置的节点集合. 目前 W3C 推荐标准为 Selectors Level 3 , 在 ie9+ 以及 firefox,chrome,mobile 等浏览器上原生有基本一致的实现,而在 ie 下则需要 使用 javascript 模拟实现,本文介绍一种基于匹配回朔的 css3 选择器引擎实现,特定应用于 ie6,7,8 下. 语法 css 选择器是一种紧凑

求助:C新手回朔全排列无输出!

xm9db5突云佳苯良灸<http://weibo.com/p20180414Pp/230927983294825006637056> e4b37l竟爸莆桶偌婆<http://weibo.com/20180414pp/230927983166292829675520> juf9vf嘲臀朔锹缸庞<http://weibo.com/20180414pp/230927983143257418506240> mx0c61狈欧端湛呀赖<http://weibo.com/FE

【算法学习笔记】28.枚举法 解题报告 SJTU_OJ 1255 1256 魔戒

1256. 你的魔戒?不,是你的魔戒.加强版 Description 在前往末日火山的途中,佛罗多与他的霍比特人同胞不幸被半兽人抓住了.半兽人要对每个霍比特人进行询问,以找出哪个霍比特人携带了至尊魔戒.每个霍比特人可能会说以下几种话: I have the ring. 我有魔戒. I have not the ring. 我没有魔戒. XXX has the ring. XXX有魔戒.(XXX表示某个霍比特人的名字) XXX has not the ring. XXX没有魔戒. Today is

【算法学习笔记】26.扫描维护法 解题报告 SJTU_OJ 1133 数星星

SJTU OJ 1133. 数星星 Description 主任和小伙伴晚上非常无聊,于是带着他的宠物狗出来走走.主任突然发现天空中有一条长度为N的字符串,里面的字符都是大写字母.于是主任和他的小伙伴们开始数星星(STAR). 主任和他的小伙伴还有宠物狗数星星的数法不太一样.小伙伴是一个很教条的人,他只喜欢有规则的东西.所以他每次会在字符串里面找最早的’S’,然后找’S’之后最早的’T’,然后找’T’之后最早的’A’,最后找’A’之后最早的’R’.也就是找一个位置最靠前的STAR的子序列.每次找

leetCode 49.Anagrams (回文构词法) 解题思路和方法

Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 思路:这题要是解,必须知道什么是回文构词法.所谓回文构词法就是把一个单词的顺序调整,形成新的单词,如"eat","tea"就是回文构词法. 所以回文构词法一定是相同的字母不同的顺序,而且最少有两个单词. 本题是将单词排序之