3109: [cqoi2013]新数独 (回溯)

#include<iostream>
#include<cstdio>
#define searchnext(x,y) y==9? search(x+1,1):search(x,y+1)
using namespace std;
int ans[10][10];
int cpl[10][10],cpr[10][10];
bool usel[10][10],user[10][10],uses[10][10],flag;
void print()
{
     for(int i=1;i<=9;i++)
     {
       for(int j=1;j<=9;j++)
           {
               printf("%d",ans[i][j]);
               if(j!=9)printf(" ");
           }
          printf("\n");
          }
 }
int cmp(int x,int y){return x>y? 1:-1;}
bool pd(int x,int y,int k)
{
     if(usel[x][k]||user[y][k])return 0;
     if(uses[((x-1)/3)*3+(y-1)/3+1][k])return 0;
     if(cmp(k,ans[x][y-1])!=cpl[x][y]&&cpl[x][y]!=0)return 0;
     if(cmp(k,ans[x-1][y])!=cpr[x][y]&&cpr[x][y]!=0)return 0;
     usel[x][k]=user[y][k]=uses[((x-1)/3)*3+(y-1)/3+1][k]=1;
     return 1;
 }
void search(int x,int y)
{
     if(x==10)
     {flag=1;print();return;}
     if(flag)return;
     for(int i=1;i<=9;i++)
     {
             if(pd(x,y,i))
             {
                 ans[x][y]=i;
                 searchnext(x,y);
                 ans[x][y]=0;
                 usel[x][i]=user[y][i]=uses[((x-1)/3)*3+(y-1)/3+1][i]=0;
             }
     }
 }
int main()
{
    char ch[2];
    for(int i=1;i<=9;i++)
    {
            for(int j=1;j<=9;j++)
            {
                    if(j%3!=0)
                    {
                        scanf("%s",ch);
                        if(ch[0]=='>')cpl[i][j+1]=-1;
                        else cpl[i][j+1]=1;
                    }
            }
            if(i%3!=0)
            for(int j=1;j<=9;j++)
            {
                    scanf("%s",ch);
                    if(ch[0]=='v')cpr[i+1][j]=-1;
                    else cpr[i+1][j]=1;
                    }
            }
    search(1,1);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中南民族大学管理学院 学生课程设计报告 课题名称: java课程设计 选题名称: 九宫格数独 年 级: 2009 专 业: 信息管理与信息系统 学 号: 姓 名: 指导教师: 完成地点: 管理学院综合实验室 完成日期: 2011年9月25日 2011学年至2012学年度第一学期 目 录 1. 题目描述 3 2. 问题分析 3 3. 问题分解 4 4. 系统设计 6 5. 系统实现 11 6. 系统设计和软件发布 24 7. 难点及关键技术分析 31 8. 心得体会 32 一、题目(问题)描述 在9×9格的大九宫格中有9个3×3格的小九宫格,并提供一定数量的数字。根据这些数字, 利用逻辑和推理,在其它的空格上填入1到9的数字。每个数字在每个小九宫格内只能出 现一次,每个数字在每行、每列也只能出现一次。 这种游戏只需要逻辑思维能力,与数字运算无关。虽然玩法简单,但数字排列方式却千 变万化,所以不少教育者认为数独是锻炼脑筋的好方法。 二、问题分析 1、基本解法:利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。   实际寻找解的过程为:   使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数 字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。   那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,由于1- 9的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以:   如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字   如果某列中已经有了某一数字,则该列中的其他位置不可能再出现这一数字 如果某区块中已经有了某一数字,则该区块中的其他位置不可能再出现这一数字。 单元格:数独中最小的单元,标准数独中共有81个;  行:横向9个单元格的集合;   列:纵向9个单元格的集合;  宫:粗黑线划分的区域,标准数独中为3×3的9个单元 格的集合;  已知数:数独初始盘面给出的数字;  候选数:每个空单元格中可以 填入的数字。 2、软件系统的功能 可弹出游戏界面,方便用户操作,界面易于用户理解。可以选择游戏开始或重开 局。可以判断正误,能给出正确答案,当输入的内容不符合要求时,弹出对话框, 提示输入错误。当结果不正确时,弹出对话框,提示答案错误。答案正确时。弹出 对话框,显示答案正确。在九宫格数独游戏界面和弹出的消息提示界面有相关的最 小化、最大化、关闭等按钮可以操作。 3. 对性能的要求 1. 具有较强的实用性 2. 易于理解和应用 3. 对程序的配置要求不高,能广泛应用 三、问题分解 1. 分析找出问题域中的对象,并将对象归类,注意筛选掉不必要的对象或类。 对象: 属于ShuDu1主类的对象: MenuBar、Menu、MenuItem、JComboBox 属于ShuDuAns类的对象:JTextField 属于String类的对象:atext[i][j] 属于JtextField类的对象:text[i][j]、 属于JPanel类的对象:apanel[ ]、panel[ ] 类:包括上述所有类及父类Jframe。 2、确定类的属性。 ShuDu1: public String: public JtextField:private JPanel:private Jframe:public 3、确定对象之间的关系,包括依赖、泛化、关联、实现等等。 Jframe与主类ShuDu1之间:泛化 texts[ ](JtextField)与atext [ ](String)之间:依赖 String与ShuDu1之间:依赖 Resizable、Editable、Visible与texts[ ]之间:实现 i、j与text[i][j]、atext[i][j]之间:关联 "类设计 " "类名 "角色 "变量(属性) "行为 " "ShuDu1 "表示一个数独 "MenuaBar:添加菜单项, "setSize():设置尺 " " " " "寸等 " " " " "add():添加文本及组 " " " " "件 " " " " "setMenuBar():设置难" " " " "易等级菜单 " "ShuDuAns "设置答案窗口 " "setSize():设置尺 " " " " "寸等 " " " " "JPanel( " " " " "):设置面板布局 " "Public void "单击事件处理 "单击实践 "JOptionPaneshowMess" "actionPerformed(Acti"方法 " "ageDialog():弹出提 " "onEvent e) " " "示信息框 " "接口名 "属性 " "ActionListener "add " " "

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值