dfs减枝回溯! HDU 5113
来源:互联网 发布:授权平台源码 编辑:程序博客网 时间:2024/04/29 13:56
#include<bits/stdc++.h>using namespace std;int n,m,k;int yy[60];int g[30][30];bool jud(int x,int y,int i){ if(x<0||x>=n||y<0||y>=m) return true; if(g[x][y]!=i) return true; return false;}bool Cut(int step){ int le = (n*m-step+1)/2; for(int i=0;i<k;i++) { if(le<yy[i]) return true; } return false;}bool dfs(int x,int y,int step){ if(x==n) return true; if(y==m) return dfs(x+1,0,step); if(Cut(step)) return false; for(int i=0;i<k;i++) if(yy[i]) { int x1=x-1,y1=y; int x2=x,y2=y-1; if( jud(x1,y1,i)&&jud(x2,y2,i) ) { yy[i]--; g[x][y]=i; if(dfs(x,y+1,step+1)) return true; yy[i]++; } } return false;}int main(){ int t,kase=0;scanf("%d",&t); while(t--){ memset(g,0,sizeof(g)); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<k;i++) scanf("%d",&yy[i]); printf("Case #%d:\n",++kase); if(dfs(0,0,0)){ printf("YES\n"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(j==0) printf("%d",g[i][j]+1); else printf(" %d",g[i][j]+1); } printf("\n"); } } else printf("NO\n"); } return 0;}
比赛时想的是下面这种方法
还是有一步没想到
先填奇数格子后填偶数格子
样例不过
后换先偶后积 后来全加上还是wrong
所以填颜色的顺序还是有问题的
因该按照最多最少次多次少的顺序填
看一组样例就会明白
3 3 3
1 4 4
这组样例,按有颜色多到少排是不对的
有的题解说的四个方向也就是分横和列的奇数偶数
只判横也是能过的
#include<bits/stdc++.h>using namespace std;int num[60];struct xx{ int ID,num; bool operator <(const xx&rhs) const { return num>rhs.num; }}Y[60],YY[60];int YYY[60];int a[30][30];int main(){ int t,kase=0;scanf("%d",&t); while(t--){ memset(a,-1,sizeof(a)); memset(Y,0,sizeof(Y)); memset(YY,0,sizeof(YY)); int n,m,k;scanf("%d%d%d",&n,&m,&k); for(int i=0;i<k;i++) { scanf("%d",&Y[i].num); Y[i].ID=i; } sort(Y,Y+k);// printf("####:");// for(int i=0;i<k;i++) printf("%d ",Y[i].num); printf("\n"); int y1=0,y2=k-1;//printf("***:"); for(int i=0;i<k;i++) { if(i%2==0) YY[i]=Y[y1++]; else YY[i]=Y[y2--]; //printf("%d ",YY[i].num); //printf("ID[%d] ",YY[i].ID); }//printf("\n"); int J=0; for(int i=0;i<k;i++) { while(YY[i].num--) YYY[J++] = YY[i].ID;}// printf("YYYY:");// for(int i=0;i<n*m;i++) printf("%d ",YYY[i]); printf("\n"); int K=0; for(int i=0;i<n;i++){ if( !( i&1) ) { for(int j=0;j<m;j+=2) a[i][j]=YYY[K++]; } else { for(int j=1;j<m;j+=2) a[i][j]=YYY[K++]; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(a[i][j]==-1){ a[i][j]=YYY[K++]; } } } int flag=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(j+1<m&&a[i][j]==a[i][j+1]) { flag=0; break; } if(j-1>=0&&a[i][j]==a[i][j-1]) { flag=0; break; } if(i+1<n&&a[i][j]==a[i+1][j]) { flag=0; break; } if(i-1>=0&&a[i][j]==a[i-1][j]) { flag=0; break; } } if(flag==0 ) break; } if(flag==0){ memset(a,-1,sizeof(a)); flag=1; int K=0; for(int i=0;i<n;i++){ if( !( i&1) ) { for(int j=1;j<m;j+=2) a[i][j]=YYY[K++]; } else { for(int j=0;j<m;j+=2) a[i][j]=YYY[K++]; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(a[i][j]==-1){ a[i][j]=YYY[K++]; } } } flag=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(j+1<m&&a[i][j]==a[i][j+1]) { flag=0; break; } if(j-1>=0&&a[i][j]==a[i][j-1]) { flag=0; break; } if(i+1<n&&a[i][j]==a[i+1][j]) { flag=0; break; } if(i-1>=0&&a[i][j]==a[i-1][j]) { flag=0; break; } } if(flag==0 ) break; } } if(flag==0&&0){ memset(a,-1,sizeof(a)); flag=1; int K=0; for(int j=0;j<m;j++){ if( !( j&1) ) { for(int i=1;i<n;i+=2) a[i][j]=YYY[K++]; } else { for(int i=0;i<n;i+=2) a[i][j]=YYY[K++]; } } for(int j=0;j<m;j++){ for(int i=0;i<n;i++) { if(a[i][j]==-1){ a[i][j]=YYY[K++]; } } } flag=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(j+1<m&&a[i][j]==a[i][j+1]) { flag=0; break; } if(j-1>=0&&a[i][j]==a[i][j-1]) { flag=0; break; } if(i+1<n&&a[i][j]==a[i+1][j]) { flag=0; break; } if(i-1>=0&&a[i][j]==a[i-1][j]) { flag=0; break; } } if(flag==0 ) break; } } if(flag==0&&0){ memset(a,-1,sizeof(a)); flag=1; int K=0; for(int j=0;j<m;j++){ if( !( j&1) ) { for(int i=0;i<n;i+=2) a[i][j]=YYY[K++]; } else { for(int i=1;i<n;i+=2) a[i][j]=YYY[K++]; } } for(int j=0;j<m;j++){ for(int i=0;i<n;i++) { if(a[i][j]==-1){ a[i][j]=YYY[K++]; } } } flag=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++) { if(j+1<m&&a[i][j]==a[i][j+1]) { flag=0; break; } if(j-1>=0&&a[i][j]==a[i][j-1]) { flag=0; break; } if(i+1<n&&a[i][j]==a[i+1][j]) { flag=0; break; } if(i-1>=0&&a[i][j]==a[i-1][j]) { flag=0; break; } } if(flag==0 ) break; } } printf("Case #%d:\n",++kase); if(flag) { printf("YES\n");// printf("^^^^^^\n"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(j==0) printf("%d",a[i][j]+1); else printf(" %d",a[i][j]+1); } printf("\n"); }// printf("^^^^^^\n"); } else printf("NO\n"); } return 0;}
0 0
- dfs减枝回溯! HDU 5113
- hdu 5113(dfs+剪枝+回溯)
- hdu 1045 DFS+回溯
- HDU 1015 dfs回溯
- hdu 1045 DFS回溯
- HDU 1016 dfs+回溯
- hdu 1016 dfs+回溯
- HDU 1242 Rescue - DFS 回溯
- HDU 1015 爆搜 /dfs+回溯
- HDU 1181 DFS回溯思想
- HDU 1015 safecraker (DFS 回溯)
- hdu 2616 dfs回溯暴力
- hdu 5113 Black And White (dfs回溯+剪枝)
- 【DFS 回溯】HDU 1045 Fire Net
- HDU 1045 Fire Net(DFS回溯)
- hdu 1045 Fire Net(DFS+回溯)
- hdu 2553 N皇后问题(DFS+回溯)
- HDU 5045 Contest(DFS 回溯)
- java
- ee
- hi
- erlang的正则匹配和文本解析
- java并发编程第六章(4)使用基于优先级的阻塞式线程安全列表
- dfs减枝回溯! HDU 5113
- 我的老师是孙悟空
- 求两数的最大公约数和最小公倍数
- 树形DP入门题 cf 161D
- 树莓派自动挂载usb移动存储设备
- 关于IOS登录实现
- 了解zookeeper-续
- android 获得程序列表
- 新一代大神