ZOJ-1517

来源:互联网 发布:移动网络变成电信 编辑:程序博客网 时间:2024/06/05 23:44

魔方模拟。。蛋疼无比的多维数组处理,又是超级苦力活,一点一点写吧,反正就是模拟当前面的旋转和相邻四条边的旋转。。写了N久

#include<stdio.h>#include<string.h>static int adj[7][4] = { { 0, 0, 0, 0 }, { 5, 2, 6, 4 }, { 1, 5, 3, 6 }, { 2, 5,4, 6 }, { 6, 3, 5, 1 }, { 2, 1, 4, 3 }, { 1, 2, 3, 4 } };static int edge[7][4][6] = { { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0,0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 } }, { { 0, 0, 1, 0, 2, 0 }, { 0, 0,1, 0, 2, 0 }, { 0, 0, 1, 0, 2, 0 }, { 2, 2, 1, 2, 0, 2 } }, { { 2, 2, 1,2, 0, 2 }, { 2, 0, 2, 1, 2, 2 }, { 0, 0, 1, 0, 2, 0 }, { 0, 2, 0, 1, 0,0 } }, { { 2, 2, 1, 2, 0, 2 }, { 2, 2, 1, 2, 0, 2 },{ 0, 0, 1, 0, 2, 0 }, { 2, 2, 1, 2, 0, 2 } }, { { 2, 0, 2, 1, 2, 2 }, {2, 2, 1, 2, 0, 2 }, { 0, 2, 0, 1, 0, 0 }, { 0, 0, 1, 0, 2, 0 } }, { { 0,2, 0, 1, 0, 0 }, { 0, 2, 0, 1, 0, 0 }, { 0, 2, 0, 1, 0, 0 }, { 0, 2, 0,1, 0, 0 } }, { { 2, 0, 2, 1, 2, 2 }, { 2, 0, 2, 1, 2, 2 }, { 2, 0, 2, 1,2, 2 }, { 2, 0, 2, 1, 2, 2 } } };static void rotation(char map[3][3], int flag){char temp[3][3];int i, j;for (i = 0; i < 3; i++)for (j = 0; j < 3; j++)if (flag)temp[j][2 - i] = map[i][j];elsetemp[2 - j][i] = map[i][j];memcpy(map, temp, sizeof(temp));}//static void print(char map[7][3][3])//{//int i, j;//for (i = 0; i < 3; i++)//{//printf("    ");//for (j = 0; j < 3; j++)//putchar(map[5][i][j]);//putchar('\n');//}//for (i = 0; i < 3; i++)//{//for (j = 0; j < 12; j++)//{//putchar(map[j / 3 + 1][i][j % 3]);//if ((j + 1) % 3 == 0)//putchar(' ');//}//putchar('\n');//}//for (i = 0; i < 3; i++)//{//printf("    ");//for (j = 0; j < 3; j++)//putchar(map[6][i][j]);//putchar('\n');//}//}static int win(char map[7][3][3]){int k, i, j;char c;for (k = 1; k <= 6; k++){c = map[k][0][0];for (i = 0; i < 3; i++)for (j = 0; j < 3; j++)if (map[k][i][j] != c)return 0;}return 1;}int main(){int t;char map[7][3][3], s[30];scanf("%d", &t);getchar();while (t--){int i, j, k;for (i = 0; i < 3; i++){gets(s);for (j = 0; j < 3; j++)map[5][i][j] = s[6 + j * 2];}for (i = 0; i < 3; i++){gets(s);for (j = 0; j < 12; j++)map[j / 3 + 1][i][j % 3] = s[j * 2];}for (i = 0; i < 3; i++){gets(s);for (j = 0; j < 3; j++)map[6][i][j] = s[6 + j * 2];}int n;while (scanf("%d", &n), n){char temp[3];int prev, face, *index, *pi;if (n > 0){rotation(map[n], 1);face = adj[n][3];index = edge[n][3];for (i = 0; i < 3; i++)temp[i] = map[face][index[i * 2]][index[i * 2 + 1]];for (k = 3; k >= 1; k--){face = adj[n][k];index = edge[n][k];prev = adj[n][k - 1];pi = edge[n][k - 1];for (i = 0; i < 3; i++)map[face][index[i * 2]][index[i * 2 + 1]] =map[prev][pi[i * 2]][pi[i * 2 + 1]];}face = adj[n][0];index = edge[n][0];for (i = 0; i < 3; i++)map[face][index[i * 2]][index[i * 2 + 1]] = temp[i];}else{n = -n;rotation(map[n], 0);face = adj[n][0];index = edge[n][0];for (i = 0; i < 3; i++)temp[i] = map[face][index[i * 2]][index[i * 2 + 1]];for (k = 0; k <= 2; k++){face = adj[n][k];index = edge[n][k];prev = adj[n][k + 1];pi = edge[n][k + 1];for (i = 0; i < 3; i++)map[face][index[i * 2]][index[i * 2 + 1]] =map[prev][pi[i * 2]][pi[i * 2 + 1]];}face = adj[n][3];index = edge[n][3];for (i = 0; i < 3; i++)map[face][index[i * 2]][index[i * 2 + 1]] = temp[i];}}getchar();puts(win(map) ? "Yes, grandpa!" : "No, you are wrong!");}return 0;}


0 0
原创粉丝点击