SGU 125 Shtirlits 搜索+可行性剪枝
500ms时限406ms水过……
直接枚举肯定超时,需要剪枝。
枚举每个格子的元素,检查其左上角和正上方格子是否满足条件,若不满足不必再向下搜索。
在 这里 看到一个更好的方法: 枚举每个格子是哪个相邻的比它大。然后DFS看看有没有环。这样的复杂度只有(2^5*3^5)。
不过我没写出来……而且也不太清楚这个时间复杂度是怎么算的……求指点!
#include <cstdio>
#include <cstring>
#include <cstdlib> const int dx[] = { -, , , };
const int dy[] = { , , -, }; int N;
int mat[][];
int G[][]; bool check( int i, int j )
{
return i >= && i < N && j >= && j < N;
} //wh=true 代表检查左上角格子是否满足条件, wh=false代表检查正上方格子
bool ok( int x, int y, bool wh )
{
int cnt = ;
for ( int k = ; k < ; ++k )
{
int xx = x + dx[k];
int yy = y + dy[k];
if ( check( xx, yy ) && G[xx][yy] > G[x][y] ) ++cnt;
} if ( wh ) return cnt == mat[x][y];
return cnt <= mat[x][y];
} bool Judge()
{
int cnt = ; for ( int i = ; i < N; ++i )
{
for ( int j = ; j < N; ++j )
{
cnt = ;
for ( int k = ; k < ; ++k )
{
int xx = i + dx[k];
int yy = j + dy[k];
if ( check( xx, yy ) )
{
if ( G[xx][yy] > G[i][j] )
++cnt;
}
}
if ( cnt != mat[i][j] ) return false;
}
} return true;
} bool DFS( int cur )
{
if ( cur == N * N )
{
if ( Judge() ) return true;
return false;
} int x = cur / N;
int y = cur % N;
for ( int i = ; i < ; ++i )
{
G[x][y] = i; bool okey = true; if ( check( x - , y - ) )
{
if ( !ok( x - , y - , true ) )
okey = false;
} if ( okey && check( x - , y ) )
{
if ( !ok( x - , y, false ) )
okey = false;
} if ( okey )
{
if ( DFS( cur + ) )
return true;
} G[x][y] = -;
} return false;
} int main()
{
//freopen( "s.out", "w", stdout );
while ( scanf( "%d", &N ) == )
{
for( int i = ; i < N; ++i )
for( int j = ; j < N; ++j )
scanf( "%d", &mat[i][j] ); memset( G, -, sizeof( G ) );
if ( DFS( ) )
{
for ( int i = ; i < N; ++i )
{
for ( int j = ; j < N; ++j )
{
if ( j ) putchar(' ');
printf( "%d", G[i][j] );
}
puts("");
}
}
else puts("NO SOLUTION");
}
return ;
}
SGU 125 Shtirlits 搜索+可行性剪枝的更多相关文章
- sgu 125 Shtirlits dfs 难度:0
125. Shtirlits time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a checkered fi ...
- Shtirlits - SGU 125(搜索)
题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”. 分析:数据规模比较小,可以直接暴力枚举每个点的值. 代码如下: #inclu ...
- SGU 125.Shtirlits
时间限制:0.25s 空间限制:4M 题意: 有N*N的矩阵(n<=3),对所有i,j<=n有G[i][j]<=9,定义f[i][j]为G[i][j]四周大于它的数的个数(F[i][ ...
- 深搜的剪枝技巧(三)——Sticks(可行性剪枝、上下界剪枝、最优性剪枝)
小木棍(最优性剪枝.可行性剪枝) 一.问题描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,已知每段的长都不超过 50 .现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ...
- luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
LINK:智破连环阵 考试的时候 题意没理解清楚 题目是指一个炸弹爆炸时间结束后再放另一个炸弹 而放完一个炸弹紧接另一个炸弹.题目中存在然后二字. 这样我们可以发现某个炸弹只会炸连续的一段. 但是 由 ...
- 搜索(剪枝优化):HDU 5113 Black And White
Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...
- [CF293B]Distinct Paths_搜索_剪枝
Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...
- ICPC Asia Nanning 2017 I. Rake It In (DFS+贪心 或 对抗搜索+Alpha-Beta剪枝)
题目链接:Rake It In 比赛链接:ICPC Asia Nanning 2017 Description The designers have come up with a new simple ...
- 【NOI1999、LOJ#10019】生日蛋糕(搜索、最优化剪枝、可行性剪枝)
主要是剪枝的问题,见代码,讲的很详细 #include<iostream> #include<cstdio> #include<cmath> #include< ...
随机推荐
- angularjs源码分析之:angularjs执行流程
angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,l ...
- word检视意见导出(VBA)
Private Sub CommandButton1_Click() 'Dim Cmt As Comment Dim excelApp As Object Dim xlsWbk, objWdApp A ...
- JavaScript 变量、作用域和内存问题
JavaScript的基本类型值和引用类型值具有以下特点: 1.基本类型值在内存中占据固定的大小,因此被保存在栈内存中: 2.引用类型值是对象,保存在堆内存中: 3.从变量向另一个变量复制基本类型的值 ...
- windows下配置nodejs+npm
windows下安装nodejs是比较方便的 (v0.6.0之后,支持windows native),进入官网http://nodejs.org/ 点击install即可安装.下载完成后一路next ...
- 《编写高质量代码:改善Java程序的151个建议》笔记
To fight the unthinkable,you have to be willing to do the unthinkable. 不要在循环中使用try catch,应该放在循环的外面 ...
- 《我是一只IT小小鸟》阅读笔记
<我是一只IT小小鸟>,这本书对我来说,有可能我现在并不懂得那其中的道理,但是,我觉得它写的很好,很现在的我很相似,但是在里面,我看到了他们都在说,一开始可能并不对IT这门课有很深的见解, ...
- jQuery的弹出窗口插件colorbox
官方网站:http://colorpowered.com/colorbox/ 支持 照片,照片组,幻灯片,ajax,内联 和 iframe 框架. 通过CSS 控制外观,使用用户可以很容易重新定制外观 ...
- hdu 3123 GCC 阶乘
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123 The GNU Compiler Collection (usually shortened t ...
- 【BZOJ】【1005】【HNOI2008】明明的烦恼
Prufer序列/排列组合+高精度 窝不会告诉你我是先做了BZOJ1211然后才来做这题的>_>(为什么?因为我以前不会高精度呀……) 在A了BZOJ 1211和1089之后,蒟蒻终于有信 ...
- java 验证电话号码(手机和固话)