UVa 129 Krypton Factor

注意输出格式,比较坑爹。

每次要进行处理去掉容易的串,统计困难串的个数。

#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#define INF 1000000000LL
#define ll long long
using namespace std;
];
int cnt,K,L;
bool check(int len)
{
    int l=strlen(str);
    ||l==) return false;
    ; i<=len/; ++i)
    {
        bool ok=true;
        ; j<i&&ok; ++j)
        {
            -j]!=str[len--i-j])
                ok=false;
        }
        if(ok) return true;
    }
    return false;
}
void dfs(int pos)
{
    if(cnt>=K) return ;
    else
    {
        ; i<L; ++i)
        {
            str[pos]='A'+i;
            str[pos+]=;
            )) cnt++;
            else continue ;
            dfs(pos+);
            if(cnt>=K) return ;
        }
    }
}
int main()
{
    while(scanf("%d%d",&K,&L)!=EOF)
    {
        if(!K&&!L) break;
        cnt=;
        dfs();
        int L=strlen(str);
        ; str[i]; ++i)
        {
            ==&&i%) putchar(' ');
            putchar(str[i]);
            )%==) putchar('\n');
        }
        ) putchar('\n');
        printf("%d\n",L);
    }
    ;
}

SPOJ COMCB  1003

注意棋盘方格总数不会超过26。所以可以尝试dfs回溯寻找最优解。

怎么找字典序最小的,这个把棋盘画出来,然后指定一下每次跳的方向的顺序就行。如果第一个跳完全部棋盘的就是最优解。

这里要求输出最优解,每个位置是二维的,可以把它们压缩成一维,开一个数组,下标存第几步,内容存位置,这样就方便储存了。

实际上可行解并不多,可以打表。


HDU 4848 Wow! Such Conquering!

首先用fylod求最短路,然后搜索。时间复杂度大约是30!。肯定要剪枝。

有两个剪枝,一个是如果当前时刻有星球永远无法到达,则return,另一个是如果到该星球以后的时间花费比当前最优解要小则剪枝。这样就能过了。

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 100000000
using namespace std;
][],tim[];
int n;
int ans;
];
void dfs(int now,int rest,int all,int sum)
{
    if(all>=ans) return ;
    )
    {
        ans=min(ans,all);
        return ;
    }
    ; i<n; ++i)
        if((!vis[i])&&(sum+dist[now][i]>tim[i]))
            return;
    ; i<n; ++i)
    {
        if(!vis[i])
        {
            int time=sum+dist[now][i];
            if(time<=tim[i])
            {
                if(ans<=all+rest*time) continue;
                vis[i]=true;
                dfs(i,rest-,all+time,time);
                vis[i]=false;
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        ; i<n; ++i)
            ; j<n; ++j)
            {
                scanf("%d",&dist[i][j]);
            }
        ; k<n; ++k)
            ; i<n; ++i)
                ; j<n; ++j)
                    dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
        ; i<n; ++i)
        {
            scanf("%d",&tim[i]);
        }
        ans=inf;
        memset(vis,,sizeof(vis));
        vis[]=true;
        dfs(,n-,,);
        if(ans==inf) puts("-1");
        else printf("%d\n",ans);
    }
    ;
}

SGU 125  Shtirlits

给一个矩阵B,每个元素B[i][j]表示A[i][j]上下左右四周有多少个数大于自身。输出一个可能的矩阵A。

由于n<=3,完全可以暴力搜索解决。但是9^9肯定会超时的,考虑剪枝。对于每个A[i][j]枚举可能的元素,当枚举到第二行以上的时候,该元素上面的一个元素四周的元素都已经确定了,可以判断是否满足题意,不满足则剪枝。当枚举到最后一行的时候,还可以判断左边的元素是否满足题意。当所有元素都枚举完毕,要进行一次全体的判断,如果符合就是答案。

之前想到一个剪枝,以为每次枚举A[i][j],可以从0枚举到9-B[i][j]。其实这是不对的,因为比A[i][j]大的元素可能是相同的。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
][];
][];
int n;
bool judge(int x,int y)
{
    <=x&&x<n&&<=y&&y<n;
}
][]= {{-,},{,-},{,},{,}};
bool check(int x,int y)
{
    ;
    ; i<; ++i)
    {
        ],ny=y+Move[i][];
        if(judge(nx,ny))
        {
            if(A[x][y]<A[nx][ny])
                cnt++;
        }
    }
    return cnt==B[x][y];
}
bool dfs(int cur)
{
    if(cur==n*n)
    {
         ;i<n;++i)
            ;j<n;++j)
            if(!check(i,j)) return false;
         return true;
    }
    const int x=cur/n,y=cur%n;
    ; i<=; ++i)
    {
        A[x][y]=i;
        &&!check(x-,y))||(x==n-&&y>=&&!check(x,y-)))
            continue;
        ))
            return true;
    }
    return false;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        ; i<n; ++i)
            ; j<n; ++j)
                scanf("%d",&B[i][j]);
        ))
            puts("NO SOLUTION");
        else
        {
            ; i<n; ++i)
            {
                ; j<n; ++j)
                    if(!j) printf("%d",A[i][j]);
                    else printf(" %d",A[i][j]);
                printf("\n");
            }
        }
    }
    ;
}

POJ 2676 Sudoku

简单数独。用一个剪枝,每次填该行该列该块未出现的数字,可以AC。

倒着搜索用时更少。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#define INF 1000000000
#define LL long long
#define MAXN 100005
using namespace std;
][];
][];
][],visrow[][],visblock[][];
void init()
{
    memset(grid,,sizeof(grid));
    memset(zero,,sizeof(zero));
    memset(viscol,,sizeof(viscol));
    memset(visrow,,sizeof(visrow));
    memset(visblock,,sizeof(visblock));
}
bool dfs(int cur)
{
    ) return true;
    ,y=cur%,num=(x/*)+(y/);
    );
    ; i<=; ++i)
        if(!visrow[x][i]&&!viscol[y][i]&&!visblock[num][i])
        {
            visrow[x][i]=viscol[y][i]=visblock[num][i]=true;
            grid[x][y]=i;
            )) return true;
            visrow[x][i]=viscol[y][i]=visblock[num][i]=false;
        }
    return false;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        init();
        ; i<; ++i)
        {
            ];
            scanf("%s",str);
            ; str[j]; ++j)
            {
                grid[i][j]=str[j]-';
                if(!grid[i][j])
                    zero[i][j]=true;
            }
        }
        ; i<; ++i)
        {
            ; j<; ++j)
            {
                viscol[j][grid[i][j]]=true;
                visrow[i][grid[i][j]]=true;
                visblock[(i/*)+(j/)][grid[i][j]]=true;
            }
        }
        dfs();
        ; i<; ++i)
        {
            ; j<; ++j)
                printf("%d",grid[i][j]);
            printf("\n");
        }
    }
    ;
}

POJ 2918 Tudoku

同POJ2676

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#define INF 1000000000
#define LL long long
#define MAXN 100005
using namespace std;
][];
][];
][],visrow[][],visblock[][];
void init()
{
    memset(grid,,sizeof(grid));
    memset(zero,,sizeof(zero));
    memset(viscol,,sizeof(viscol));
    memset(visrow,,sizeof(visrow));
    memset(visblock,,sizeof(visblock));
}
bool dfs(int cur)
{
    ) return true;
    ,y=cur%,num=(x/*)+(y/);
    );
    ; i<=; ++i)
        if(!visrow[x][i]&&!viscol[y][i]&&!visblock[num][i])
        {
            visrow[x][i]=viscol[y][i]=visblock[num][i]=true;
            grid[x][y]=i;
            )) return true;
            visrow[x][i]=viscol[y][i]=visblock[num][i]=false;
        }
    return false;
}
int main()
{
    ;
    scanf("%d",&T);
    while(T--)
    {
        init();
        ; i<; ++i)
        {
            ];
            scanf("%s",str);
            ; str[j]; ++j)
            {
                grid[i][j]=str[j]-';
                if(!grid[i][j])
                    zero[i][j]=true;
            }
        }
        ; i<; ++i)
        {
            ; j<; ++j)
            {
                viscol[j][grid[i][j]]=true;
                visrow[i][grid[i][j]]=true;
                visblock[(i/*)+(j/)][grid[i][j]]=true;
            }
        }
        dfs();
        printf("Scenario #%d:\n",++kase);
        ; i<; ++i)
        {
            ; j<; ++j)
                printf("%d",grid[i][j]);
            printf("\n");
        }
        if(T) printf("\n");
    }
    ;
}

UVa 989  Su Doku

注意判断无解的情况。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#define INF 1000000000
#define LL long long
#define MAXN 100005
using namespace std;
][];
][];
][],visrow[][],visblock[][];
void init()
{
    memset(grid,,sizeof(grid));
    memset(zero,,sizeof(zero));
    memset(viscol,,sizeof(viscol));
    memset(visrow,,sizeof(visrow));
    memset(visblock,,sizeof(visblock));
}
int n,N;
bool dfs(int cur)
{
    if(cur==N*N) return true;
    int x=cur/N,y=cur%N,num=(x/n*n)+(y/n);
    );
    ; i<=N; ++i)
        if(!visrow[x][i]&&!viscol[y][i]&&!visblock[num][i])
        {
            visrow[x][i]=viscol[y][i]=visblock[num][i]=true;
            grid[x][y]=i;
            )) return true;
            visrow[x][i]=viscol[y][i]=visblock[num][i]=false;
        }
    return false;
}
int main()
{
    ;
    while(scanf("%d",&n)!=EOF)
    {
        init();
        N=n*n;
        if(kase)printf("\n");
        ; i<N; ++i)
        {
            ; j<N; ++j)
            {
                scanf("%d",&grid[i][j]);
                if(!grid[i][j])
                    zero[i][j]=true;
            }
        }
        ; i<N; ++i)
        {
            ; j<N; ++j)
            {
                viscol[j][grid[i][j]]++;
                visrow[i][grid[i][j]]++;
                visblock[(i/n*n)+(j/n)][grid[i][j]]++;
            }
        }
        bool ok=true;
        ; i<&&ok; ++i)
            ; j<=&&ok; ++j)
                ||visrow[i][j]>=||visblock[i][j]>=)
                    ok=false;
        ))
        {
            puts("NO SOLUTION");
        }
        else
        {
            ; i<N; ++i)
            {
                ; j<N; ++j)
                    if(!j) printf("%d",grid[i][j]);
                    else printf(" %d",grid[i][j]);
                printf("\n");
            }
        }
        kase=;
    }
    ;
}

ACM 暴力搜索题 题目整理的更多相关文章

  1. bnuoj 33656 J. C.S.I.: P15(图形搜索题)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...

  2. hdu 4740 The Donkey of Gui Zhou(暴力搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...

  3. Noip往年题目整理

    Noip往年题目整理 张炳琪 一.历年题目 按时间倒序排序 年份 T1知识点 T2知识点 T3知识点 得分 总体 2016day1 模拟 Lca,树上差分 期望dp 144 挺难的一套题目,偏思维难度 ...

  4. NOIP2010提高组真题部分整理(没有关押罪犯)

    目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...

  5. 2013 ACM网络搜索与数据挖掘国际会议

    ACM网络搜索与数据挖掘国际会议" title="2013 ACM网络搜索与数据挖掘国际会议"> 编者按:ACM网络搜索与数据挖掘国际会议(6th ACM Conf ...

  6. 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路

    本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...

  7. 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)

    本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...

  8. [HDU 2102] A计划(搜索题,典型dfs or bfs)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. 历年NOIP中的搜索题

    什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据 ...

随机推荐

  1. 如何查看python 的api

    python 搭建好python开发环境后,怎么查看api文档呢? 其实很简单: 首先打开命令行,在dos窗口输入: python -m pydoc -p 4895 python -m pydoc - ...

  2. away3D改造白皮书

    [多余的stage3D的考虑] 因为away3D为了支持stage本身可以有n个stage3D对象这个特性,在诸如MaterialPassBase.SubGeometry中,为Program3D.Ve ...

  3. SSH框架搭建

    1.建项目 2.添加Struts 3.添加String 注意:这里一共是五个包 4.添加Hibernate 添加完成,然后导入数据库 这时候是这样的 把小绿叶放到WEB-INF 5.简单写struts ...

  4. 0527 Sprint 1 总结

    首页 登陆与注册 除登陆和注册之外,我们觉得最主要的是做完登陆和注册的返回功能 界面选项 查询界面 显而易见的我们做了界面之后我们的工作量也减少了,因为相对来讲前期工作比较容易,而各个功能板块所计划的 ...

  5. 《精通C#》第十二章 Linq

    Linq是在.Net3.5之后首次引入的,这种查询语言简单易学,可用范围非常广泛在学着之前,一直用在数据库操作之上,但是在学习这节课之后才发现,凡是实现泛型的接口类型都可以使用linq,简单来说就是实 ...

  6. JAVA线程安全总结(转载)

    JAVA线程安全总结(一) JAVA线程安全总结(二) 最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,jav ...

  7. 判断整数是否能被n整除

    (1)1与0的特性:         1是任何整数的约数,即对于任何整数a,总有1|a.         0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0.2.4.6或 ...

  8. java selenium (四) 使用浏览器调试工具

    在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试.   首先我们需要查找和识别UI元素. 在基于Web UI 自动化测试中, 测试人员需要了解HTML, CSS和 ...

  9. 使用C++11的一点总结

          C++11已不是新鲜技术,但对于我来说,工作中用得还不够多(前东家长时间使用gcc3.4.5,虽然去年升了4.8.2,但旧模块维护还是3.4.5居多:新东家用的是4.4.6,不能完整支持C ...

  10. easyui的textbox赋值小结

    使用的系统中有个后台,需要填充单号,如下图: 每次往框里面填充都是一样的数据,复制.粘贴,而且当人数颇多的时候,就是体力活. 于是就想到通过执行js代码,自动填充这些数据. chrome下F12,查看 ...