hdu1603
来源:互联网 发布:mysql blob 中文乱码 编辑:程序博客网 时间:2024/06/05 04:35
蒟蒻的自我拯救。。。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int pieset[16][4][4]={0};//all pieces set,note piece#1 place 1111 piece#2 place 2222 no the problem says place 1111,piece#i place iii int n=0;//per cases pieces number int piesize[16][2]={0};//all pieces size m*n int piecnt[16]={0};//piecnt[i] is piece#(i+1) 's sum !0 count int puzzle[4][4]={0};//place the all piece to this matirx int flag=0;//is solution possible flag /*judge the block !0 and !0 is invalid*/ bool IsFit(int dest[][4]) { int i=0,j=0; for(i=0;i<=4-1;i++) { for(j=0;j<=4-1;j++) { if(dest[i][j]!=0&&puzzle[i][j]!=0) { return(false); } } } return(true); } /*fit the piece to the puzzle*/ int FitPie(int dest[][4]) { int i=0,j=0; for(i=0;i<=4-1;i++) { for(j=0;j<=4-1;j++) { if(dest[i][j]!=0) { puzzle[i][j]=dest[i][j]; } } } return(0); } /*unfit the piece from the puzzle*/ int UnFitPie(int dest[][4]) { int i=0,j=0; for(i=0;i<=4-1;i++) { for(j=0;j<=4-1;j++) { if(dest[i][j]!=0) { puzzle[i][j]=0; } } } return(0); } /*judge the matrix is filled with the piece*/ bool IsFilled() { int i=0,j=0; for(i=0;i<=4-1;i++) { for(j=0;j<=4-1;j++) { if(puzzle[i][j]==0) { return(false); } } } return(true); } /*DFS the piece,the cur is piece number, or index of now will place the piece*/ int DFS(int cur) { if(flag) { return(0); } if(cur>=n) { if(IsFilled())//judge the matrix is filled with the piece { flag=1; return(0); } } else { //translate the piece int i=0,j=0;//i,j is increase of the coordinate int t=0,r=0;//destination two dimension coordinate int x=0,y=0;//source two dimension coordinate for(i=-3;i<=3;i++)//can translate to - direction { for(j=-3;j<=3;j++) { int dest[4][4]={0};//we can not destroyed the original data from the pieset,this is translate destination piece int destflag=0;//break is true flag = 1, then the dest is invalid for(x=0;x<=piesize[cur][0]-1;x++) { for(y=0;y<=piesize[cur][1]-1;y++) { if(pieset[cur][x][y]>0)//find the valid point { //translate t=x+i; r=y+j; if(t>=4||r>=4||t<0||r<0)//invalid translation { destflag=1; break; } dest[t][r]=pieset[cur][x][y];//translation } } if(destflag) { break;//invalid translation } } if(!destflag)//the translation is valid { if(IsFit(dest))//the piece[cur] is fit for now puzzle matrix { FitPie(dest); DFS(cur+1); if(flag)//prevent the answer puzzle matrix recover { return(0); } UnFitPie(dest); } } } } } return(0); } /*output the puzzle*/ int OutPuzzle() { int i=0,j=0; for(i=0;i<=4-1;i++) { for(j=0;j<=4-1;j++) { printf("%d",puzzle[i][j] ); } printf("\n"); } return(0); } /*for test*/ int test() { return(0); } /*main process*/ int MainProc() { int t=0; while(scanf("%d",&n)!=EOF&&n>0) { //fromat control t++; if(t>1) { printf("\n"); } //init memset(pieset,0,sizeof(pieset)); memset(piesize,0,sizeof(piesize)); memset(puzzle,0,sizeof(puzzle)); memset(piecnt,0,sizeof(piecnt)); flag=0; int i=0,j=0,k=0; int piececnt=0; for(k=0;k<=n-1;k++) { scanf("%d%d",&piesize[k][0],&piesize[k][1]); for(i=0;i<=piesize[k][0]-1;i++) { for(j=0;j<=piesize[k][1]-1;j++) { int num=0; scanf("%1d",&num);//scanf format control if(num>0) { piececnt++; piecnt[k]++; pieset[k][i][j]=k+1;//piece#i place i } } } } if(piececnt==16)//prune,the puzzle 0' count != left pieces !0's count then prune it DFS(0); if(flag) { OutPuzzle(); } else { printf("No solution possible\n"); } } return(0); } int main(int argc, char const *argv[]) { /* code */ MainProc(); printf("\n"); return 0; }
0 0
- hdu1603
- compensate capacitance 's use
- 从一件不起眼的小事开始做起
- jQuery添加新元素/内容
- leetcode Binary Tree Postorder Traversal
- cmd命令大全
- hdu1603
- java读取中文分词工具(三)
- 利用动态规划找出最长公共单调递增子序列
- 重置iOS simulator
- 拓扑排序
- Ubuntu客户端通过WINS查找NetBIOS名称
- 东大OJ-5到100000000之间的回文质数
- [Bluetooth(SDK)]蓝牙协议栈架构
- jquery file upload报错 TypeError: Object [object Object] has no method 'progressbar'