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< ...
随机推荐
- 【Add binary】cpp
题目: Given two binary strings, return their sum (also a binary string). For example,a = "11" ...
- selenium使用IE 浏览器问题
代码如下: #coding=utf-8 from selenium import webdriver driver=webdriver.Ie() driver.get('https://www.bai ...
- HDU 5795 博弈
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Time Limit: 2000/1000 MS (Java/Oth ...
- 使用IntersectionObserver更高效的监视某个页面元素是否进入了可见窗口
比如说,你想跟踪 DOM 树里的一个元素,当它进入可见窗口时得到通知. 也许想实现即时延迟加载图片功能,或者你需要知道用户是否真的在看一个广告 banner. 你可以通过绑定 scroll 事件或者用 ...
- zepto判断手机横竖屏
var CheckOrientation = (function(){ var win = $( window ), get_orientation, last_orientation, initia ...
- [转载]115个Java面试题和答案
不知道大家有没有这样的体会,就是找工作的时候不得不准备大量面试题,而工作的时间长了面试题里的精髓却忘的差不多了... 转载几篇Java面试的bolg,温故而知新,最重要的是常来看看. 1. http: ...
- 版本控制 - Git
此篇blog只是对http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 研读后的总结,还 ...
- poi实现Excel比较
http://stackoverflow.com/questions/866346/easiest-way-to-compare-two-excel-files-in-java http://stac ...
- kerberos+ladp+hadoop-ha 安全认证部署配置
随着hadoop集群里的数据量越来越大,各业务数据都集中了里面,自然要为各业务都要提供数据支持,又希望各业务数据是相对独立安全的,这最时候就需要做安全认证了 hadoop ha 测试集群部署规划 ha ...
- Android App集成支付宝
原地址:http://blog.csdn.net/wenbingoon/article/details/7933078 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统 ...