不知道爲什麼提交就是Presentation error,output函數改來改去提交N遍最後居然AC了,但是都不記得是哪份代碼AC了。。總之算法是正確的。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
typedef struct _node
{
int width;
int high;
}NODE;
NODE desc[16];//描述物塊的寬度高度
int martix[4][4];
int result[MAX_SIZE][4][4];
int piece[16][4][4];//儲存物塊
int N;//物塊數
int num;//難題數
int find;//是否找到
void input()
{
int r,c,i,j,n;
char s[5];
for(n=0; n<N; n++)
{
scanf("%d %d", &r,&c);
for(i=0; i<r; i++)
{
scanf("%s", s);
for(j=0; j<c; j++)
if(s[j]=='1')
piece[n][i][j]=n+1;
}
desc[n].width = c;desc[n].high = r;
}
}
//定義一個矩陣間的異或操作,cur爲物塊號從0開始
int XOR(int cur,int row,int col)
{
int i,j;
for(i=0; i<desc[cur].high; i++)
for(j=0; j<desc[cur].width; j++)
{
martix[row+i][col+j]^=piece[cur][i][j];
}
return 0;
}
//檢測cur號物塊是否能在row,col處放置
int check(int cur,int row,int col)
{
int i,j;
if(4-col<desc[cur].width) return 0;
if(4-row<desc[cur].high) return 0;
for(i=0; i<desc[cur].high; i++)
for(j=0; j<desc[cur].width; j++)
{
if(piece[cur][i][j]!=0)
if(martix[row+i][col+j]!=0)
return 0;
}
return 1;
}
void solve(int cur)
{
int i,j,row,col;
if(cur==N)
{
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(martix[i][j]==0)
return;
memcpy(result[num], martix, sizeof(martix));
find=1;
return;
}
for(i=0; i<4; i++)
for(j=0; j<4; j++)
{
if(!find&&check(cur,i,j))
{
XOR(cur,i,j);//放置木塊
solve(cur+1);//去放置下一塊
XOR(cur,i,j);//恢復到放置前
}
}
}
void output()
{
int i,j,k;
for(i=0; i<num; i++)
{
if(result[i][0][0]==0)
printf("No solution possible");
else
for(j=0; j<4; j++)
{
for(k=0; k<4; k++)
printf("%c", result[i][j][k]+'0');
if(j!=3)
printf("\n");
}
if(i!=num-1)
printf("\n\n");
}
}
int main()
{
while(scanf("%d",&N))
{
if(N==0) break;
memset(martix,0,sizeof(martix));
memset(piece,0,sizeof(piece));
input();
find=0;
solve(0);
if(!find) memset(result[num], 0, sizeof(martix));//如果沒找到則置爲0
num++;
}
output();
system("pause");
return 0;
}