uva387 A Puzzling Problem

不知道爲什麼提交就是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;
}


發佈了59 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章