Shtirlits - SGU 125(搜索)
2015-09-24 18:30
309 查看
题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”。
分析:数据规模比较小,可以直接暴力枚举每个点的值。
代码如下:
分析:数据规模比较小,可以直接暴力枚举每个点的值。
代码如下:
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> using namespace std; const int MAXN = 10; int dir[4][10][5] = {{},{},{{},{2,3},{1,4},{1,4},{2,3}}, {{},{2,4},{1,3,5},{2,6},{1,5,7},{2,4,6,8},{3,5,9},{4,8},{5,7,9},{6,8}}}; int near[4][10][5] = {{},{},{{},{},{1},{1},{2,3}},{{},{},{1},{2},{1},{2,4},{3,5},{4},{5,7},{6,8}}}; int B[MAXN], A[MAXN], ok, N; bool nBigger(int k) { int i, cnt = 0, zero=0; for(i=0; dir [k][i]; i++) { if(A[k] < A[dir [k][i]]) cnt++; if(!A[dir [k][i]]) zero++; } if(cnt > B[k]) return false; if(cnt+zero < B[k]) return false; return true; } void DFS(int k) { int i, j; if(k == N*N+1) ok = 1; if(ok)return ; for(i=1; i<MAXN; i++) { A[k] = i; if(nBigger(k) == false) continue; for(j=0; near [k][j]; j++) { if(!nBigger(near [k][j])) break; } if(near [k][j] == 0) DFS(k+1); if(ok)return ; } A[k] = 0; } int main() { scanf("%d", &N); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) scanf("%d", &B[(i-1)*N+j]); DFS(1); if(!ok) printf("NO SOLUTION\n"); else { for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) printf("%d%c", A[(i-1)*N+j], j==N?'\n':' '); } return 0; }
相关文章推荐
- 回车 换行区别,怎么读入char型vector
- notes for pyspider
- shell split
- SFTP文件上传与下载
- Mysql导入导出命令
- css防止ul下的li换行(li超出宽度变成…)代码
- 转 Java集合框架的基本接口/类层次结构
- JVM启动参数详解
- 【详解】回车 换行 0X0D 0X0A CR LF \R \N WIN LINUX MAC系统
- struts2 下载
- mysql基本命令
- POJ 3189 Steady Cow Assignment
- head first python 读书笔记(十二)
- 【网络安全】XCodeGhost事件刨根问底
- 【JavaScript】【学习】3、JavaScript中的function类型
- Mysql查询
- git 删除文件
- JavaEE 添加简单的日志过滤器
- 线性表
- Minix文件系统框架 http://www.cnblogs.com/zhangchaoyang/articles/1896605.html