不知道为什么提交就是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");elsefor(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("nn");}
}
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));//如果没找到则置为0num++;}output();system("pause");return 0;
}
本文发布于:2024-01-28 11:31:18,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064126817110.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |