2 条题解
-
0
#include #include #include using namespace std; //英语 看博友分析 抄博友程序 dfs 背 int T; int n[30]; int m[30]; int a[30][10][10]; int b[10][10]; int jg; void dfs(int x) { if(jg1)//抄博友程序 背 { return; } if(xT) { int flag=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(b[i][j]0) { flag=1; } } } if(flag0) { jg=1; for(int i=0;i<4;i++)//抄博友程序 背 { for(int j=0;j<4;j++) { printf("%d",b[i][j]); } printf("\n"); } printf("\n"); } return; } for(int i=0;i<=4-n[x];i++)//抄博友程序 背 { for(int j=0;j<=4-m[x];j++)//抄博友程序 背 { int ff=0; for(int l=0;l<n[x];l++) { for(int h=0;h<m[x];h++) { if(a[x][l][h]1 && b[i+l][j+h]!=0) { ff=1; } } } if(ff0) { for(int l=0;l<n[x];l++) { for(int h=0;h<m[x];h++) { if(a[x][l][h]1) { b[i+l][j+h]=x+1; } } } dfs(x+1); for(int l=0;l<n[x];l++) { for(int h=0;h<m[x];h++) { if(a[x][l][h]1) { b[i+l][j+h]=0; } } } } } } } int main() { while(1) { scanf("%d",&T); if(T0) { break; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=0;i<T;i++) { scanf("%d%d",&n[i],&m[i]); for(int j=0;j<n[i];j++) { for(int k=0;k<m[i];k++) { scanf("%1d",&a[i][j][k]); } } } jg=0; dfs(0); if(jg0) { printf("No solution possible\n\n"); } } return 0; }
-
0
#include #include #include #include #include
using namespace std;
typedef struct _block { int row, column; int occupy; char data[4][5]; }block; block B[100];
char square[4][5] = {0};
int cover(int id, int r, int c) { if (r+B[id].row > 4 || c+B[id].column > 4) return 0; for (int i = r; i < r+B[id].row; ++ i) for (int j = c; j < c+B[id].column; ++ j) { if (square[i][j] != 0 && B[id].data[i-r][j-c] != '0') return 0; if (B[id].data[i-r][j-c] != '0') square[i][j] = '1'+id; } return 1; }
int uncover(int id) { for (int i = 0; i < 4; ++ i) for (int j = 0; j < 4; ++ j) if (square[i][j] == '1'+id) square[i][j] = 0; }
int dfs(int s, int n, int e) { if (e <= 0) { for (int i = 0; i < 4; ++ i) puts(square[i]); return 1; } if (s >= n) return 0; for (int i = s; i < n; ++ i) { if (B[i].occupy > e) continue; for (int r = 0; r <= 4; ++ r) for (int c = 0; c <= 4; ++ c) { if (cover(i, r, c) && dfs(i+1, n, e-B[i].occupy)) return 1; uncover(i); } } return 0; }
int main() { int t, r, c, cases = 0; while (cin >> t && t) { int sum = 0; for (int k = 0; k < t; ++ k) { cin >> B[k].row >> B[k].column; B[k].occupy = 0; for (int i = 0; i < B[k].row; ++ i) for (int j = 0; j < B[k].column; ++ j) { cin >> B[k].data[i][j]; if (B[k].data[i][j] == '1') { B[k].data[i][j] += k; B[k].occupy ++; } } sum += B[k].occupy; }
if (cases ++) puts(""); memset(square, 0, sizeof(square)); if (sum != 16 || !dfs(0, t, 16)) puts("No solution possible"); } return 0;
}
- 1
信息
- ID
- 562
- 时间
- 1000ms
- 内存
- 10MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 0
- 上传者