hdu 搜索+剪枝
来源:互联网 发布:java调用三汇语音卡 编辑:程序博客网 时间:2024/05/14 17:14
剪枝是c[i] < ( n*m-cnt+1)/2 ,减掉很多没必要的搜索
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAX 7using namespace std;int a[MAX][MAX];int c[MAX*MAX];bool flag = false;int t,n,m,k;void dfs ( int cnt = 0 ){ // cout << cnt << endl; if ( cnt == n*m ) { puts ("YES" ); for ( int i = 1 ; i <= n ; i++ ) { for ( int j = 1 ; j < m ; j++ ) printf ( "%d " , a[i][j] ); printf ( "%d\n" , a[i][m] ); } flag = true; return; } for ( int i = 1 ; i <= k ; i++ ) if ( c[i] > (n*m-cnt+1)/2 ) return; int x = cnt/m+1; int y = cnt%m+1; for ( int i = 1 ; i <= k ; i++ ) { if ( flag ) return; if ( !c[i] ) continue; if(i==a[x-1][y]||i==a[x+1][y]||i==a[x][y+1]||i==a[x][y-1]) continue; a[x][y] = i; c[i]--; dfs ( cnt + 1 ); a[x][y] = 0; c[i]++; }}int main ( ){ scanf ( "%d" , &t ); int cc = 1; while ( t-- ) { scanf ( "%d%d%d" , &n , &m , &k ); for ( int i = 1 ; i <= k ; i++ ) scanf ( "%d" , &c[i] ); printf ( "Case #%d:\n" , cc++ ); memset ( a , 0 , sizeof ( a ) ); flag = false; dfs ( ); if ( !flag ) puts ( "NO" ); }}
0 0
- hdu 搜索+剪枝
- hdu 1010 搜索+剪枝!!!!
- HDU 1010 搜索剪枝
- HDU 1010 搜索+剪枝
- hdu 5305 (搜索+剪枝)
- HDU 1010 【搜索+奇偶剪枝】
- HDU 1010(搜索题,DFS+剪枝)
- [HDU 4277](长春 1011 )搜索+剪枝
- [HDU 4277](长春 1011 )搜索+剪枝
- HDU 2437 Jerboas (剪枝搜索)
- hdu 4876 ZCC loves cards (搜索+剪枝)
- hdu 4924 Football Manager(搜索+剪枝+dp)
- hdu 4848 搜索+剪枝 2014西安邀请赛
- hdu 5046 重复覆盖问题 搜索+剪枝
- poj 1198 hdu 1401 搜索+剪枝 Solitaire
- hdu 3448(搜索+剪枝)Bag Problem
- hdu 1010 启发式搜索+奇偶剪枝
- hdu 5305 Friends(搜索+剪枝)
- 写点我的学习javaweb的点滴历程(我原来是学.net的)
- 20150130 【 数据结构 - 顺序链表 】 Makefile和模块分离
- socks5.py
- The server quit without updating PID file (/usr/local/mysql/data/AY140308085
- Find Minimum in Rotated Sorted Array I && II
- hdu 搜索+剪枝
- 20150130 N2
- 灰度图像--图像增强 锐化基础
- 微软的组织架构和微软的网上资源架构
- Java文件流和String的相互转化
- Android4.0窗口机制和创建过程分析
- Sudoku(POJ 2676)
- css 优先级(简洁)
- Cortex-M3-----(2)