题目链接:

https://vjudge.net/problem/UVA-519

思路:

剪枝+回溯

这个题巧妙的是他按照表格的位置开始搜索,也就是说表格是定的,他不断用已有的图片从(0,0)开始拼到(n-1,m-1)

剪枝的地方:

1.由于含'F'的面只能拼到边上,所以'F'的个数就是矩形的周长

2.含'O'的数目应该和含'I'的数目相等

3.可能会有很多重复的碎片,如果前面的碎片不能拼上去,那么后面重复的碎片也不能拼上去

坑点:

题目中明明说了只有15块碎片,但是将数组大小开到20却WA!!,说明碎片数目已经超过15个

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char maze[100][5];
int n,m;
int F=0,I=0,O=0;
int vis[100];
char loc[100][100][5];
int cmp(const void *a,const void *b){
return strcmp((char*)a,(char*)b);//strcmp()不能直接判断二维数组的大小
}
int check(int cur,int i,int j){//top, right, bottom, and left
if(i==0&&maze[cur][0]!='F') return 0;
if(i==n-1&&maze[cur][2]!='F') return 0;
if(j==0&&maze[cur][3]!='F') return 0;
if(j==m-1&&maze[cur][1]!='F') return 0;
if(i>0&&(maze[cur][0]+loc[i-1][j][2]!='I'+'O')) return 0;
if(j>0&&(maze[cur][3]+loc[i][j-1][1]!='I'+'O')) return 0;
return 1;
}
int dfs(int x,int y,int cnt){
if(cnt==n*m){//
return 1;
}
char tmp[5]={0};
for(int k=0;k<n*m;k++){
if(!vis[k]&&(strcmp(tmp,maze[k])!=0)&&check(k,x,y)){
strcpy(tmp,maze[k]);
strcpy(loc[x][y],maze[k]); vis[k]=1;
if(dfs((cnt+1)/m,(cnt+1)%m,cnt+1)) return 1; vis[k]=0;
}
}
return 0;
}
void init(){
memset(maze,0,sizeof(maze));
memset(vis,0,sizeof(vis));
memset(loc,0,sizeof(loc));
F=0,I=0,O=0;
}
int main(int argc, char** argv) {
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0&&m==0) break;
init(); for(int i=0;i<n*m;i++){
scanf("%s",maze[i]);
for(int j=0;j<4;j++){
if(maze[i][j]=='F') F++;
else if(maze[i][j]=='I') I++;
else if(maze[i][j]=='O') O++;
}
}
if(F!=(m+n)*2||I!=O){
printf("NO\n");
}else{
qsort(maze[0],n*m,sizeof(maze[0]),cmp);//q int Find=dfs(0,0,0);
if(Find) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}

最新文章

  1. script加载文件
  2. iOS 解决导航栏左右 BarButtonItem偏移位置的问题
  3. 【转】asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  4. 用shape结合selector实现点击效果
  5. ContentType
  6. find your present (2) 2095
  7. 关于Discuz与jQuery冲突问题的亲测解决方法
  8. 1854: [Scoi2010]游戏
  9. LoadRunner性能测试工具
  10. python常用的内置函数
  11. Python day 04
  12. Python数据分析学习(二):Numpy数组对象基础
  13. Csharp—碎片知识积累
  14. python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)
  15. D. Cutting Out 二分
  16. 无法在正在进行内容生成时调用 StartAt
  17. 判断一个对象是否为真 __nonzero__ 方法和 __len__方法
  18. egrep 第几列开始
  19. Three.js 类的粗略总结和实现
  20. Java精选笔记_集合【List(列表)接口】

热门文章

  1. DG修改SYS用户密码(ORA-16810,ORA-01017)
  2. Redis安装教程及安装报错解决方案(大佬勿喷)
  3. jmeter性能测试-高并发分布式部署
  4. 网络编程-python实现-TCP实现文件下载(1.1.4)
  5. 简单的冒泡排序算法(java)
  6. HCIP --- BGP属性
  7. 使用CentOS8搭建私有NAS存储的一些建议
  8. 【程序包管理】篇章2:rpm程序包来源合法和完整性验正
  9. ML.net重新训练模型需要注意的事项。
  10. 扫盲:Kotlin 的泛型