ACM 暴力搜索题 题目整理
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 暴力搜索题 题目整理的更多相关文章
- bnuoj 33656 J. C.S.I.: P15(图形搜索题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...
- hdu 4740 The Donkey of Gui Zhou(暴力搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...
- Noip往年题目整理
Noip往年题目整理 张炳琪 一.历年题目 按时间倒序排序 年份 T1知识点 T2知识点 T3知识点 得分 总体 2016day1 模拟 Lca,树上差分 期望dp 144 挺难的一套题目,偏思维难度 ...
- NOIP2010提高组真题部分整理(没有关押罪犯)
目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...
- 2013 ACM网络搜索与数据挖掘国际会议
ACM网络搜索与数据挖掘国际会议" title="2013 ACM网络搜索与数据挖掘国际会议"> 编者按:ACM网络搜索与数据挖掘国际会议(6th ACM Conf ...
- 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路
本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...
- 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)
本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...
- [HDU 2102] A计划(搜索题,典型dfs or bfs)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 历年NOIP中的搜索题
什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据 ...
随机推荐
- 真核转录组(denovo/resequencing)及案例分析
参考: 转录组文章的常规套路 文章解读:<Science>小麦转录组研究文章 转录组数据饱和度评估方法 Paper这个东西是多么的诱人,可以毕业,可以评职称,可以拿绩效. 现在的文章都是有 ...
- HTML5 十大新特性(六)——地理定位
简单地用一句话概括就是,使用js获取浏览器当前所在的地理坐标,实现LBS(Location Based Service,基于定位的服务). 下面写一下它的基本调用: if(navigator.geol ...
- 【javascript】作用域和闭包浅析
作用域 分全局作用域和局部作用域 全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用. 局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用. var val=1; //全 ...
- Windows下 Maven 使用 阿里云镜像配置
新建或者修改文件: C:\Users\user\.m2\settings.xml <settings xmlns="http://maven.apache.org/SETTINGS/1 ...
- Sprint three
登录界面: 首页: 点餐界面: 查看购物车: 结账: 经历了一个月的时间,我们小组做出了我们的餐厅点餐系统APP.对于这次团队合作,我们的小组成员分工合作做出了我们的餐厅点餐系统APP,通过这次的项目 ...
- Python’s SQLAlchemy vs Other ORMs[转发 4]peewee
peewee peewee is a small, expressive ORM. Compared to other ORMs, peewee focuses on the principal of ...
- ubuntu 下非交互式执行远程shell命令
apt-get install sshpass sshpass -p **your_password** ssh -o StrictHostKeyChecking=no "root@$ip& ...
- java selenium (六) XPath 定位
xpath 的定位方法, 非常强大. 使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面, ...
- Java8之——简洁优雅的Lambda表达式
Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西 ...
- 基于PNotify的消息提示Demo(轮询)
需求:有些任务需要定时更新,获取最新的消息,这样就需要定时轮询,再者需要一种友好的提示. 以下就是使用PNotify插件的消息提示: 1.HTML代码 <!DOCTYPE html> &l ...