| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:一般来说数组越界,自己好好查查哪里下标可能越界In Reply To:一般来说数组越界,自己好好查查哪里下标可能越界 Posted by:hawk at 2004-07-16 22:26:07 用深搜写的 用哈系表判重 如果有时间帮我看看好吗 我在zju上也交过无数次了 再不行只能放弃了…… 谢了 #include <stdio.h> #include <stdlib.h> const int maxn = 30000; int cmax [9][9] = {0, 1, 2, 1, 2, 3, 2, 3, 4, 1, 0, 1, 2, 1, 2, 3, 2, 3, 2, 1, 0, 3, 2, 1, 4, 3, 2, 1, 2, 3, 0, 1, 2, 1, 2, 3, 2, 1, 2, 1, 0, 1, 2, 1, 2, 3, 2, 1, 2, 1, 0, 3, 2, 1, 2, 3, 4, 1, 2, 3, 0, 1, 2, 3, 2, 3, 2, 1, 2, 1, 0, 1, 4, 3, 2, 3, 2, 1, 2, 1, 0}; struct point { int value, step; point *next; }; point * hx[maxn], * p, *ne, *te; int result, i, j, k, l, n, pos, max, path[100], opath[100], num, ten[10] = {1,100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1}; char c; void search(int deep) { if (num == 123456780) { max = deep; for (i = 0; i < deep; i ++) opath[i] = path[i]; return; } if (deep + 1 >= max) return; int last, lpos; last = num; lpos = pos; i = num % maxn; p = hx[i]; while (p->next != NULL) { if (p->next->value == num) { if (p->next->step <= deep) return; else {(p->next->step = deep);break;} } else if (p->next->value < num) break; p = p->next; } if (p->next == NULL) { ne = new(struct point); ne-> next = p->next; p -> next = ne; ne-> value = num; ne-> step = deep; } else if (p->next->value < num) { ne = new(struct point); ne-> next = p->next; p -> next = ne; ne-> value = num; ne-> step = deep; } //d if (pos < 7) { i = num / ten[pos] % 10; j = num / ten[pos + 3] % 10; num = num - i * ten[pos] - j * ten[pos + 3] + j * ten[pos] + i * ten[pos + 3]; pos = pos + 3; path[deep] = 4; search(deep + 1); } //u pos = lpos;num = last; if (pos > 3) { i = num / ten[pos] % 10; j = num / ten[pos - 3] % 10; num = num - i * ten[pos] - j * ten[pos - 3] + j * ten[pos] + i * ten[pos - 3]; pos = pos - 3; path[deep] = 1; search(deep + 1); } //r pos = lpos;num = last; if (pos % 3 != 0) { i = num / ten[pos] % 10; j = num / ten[pos + 1] % 10; num = num - i * ten[pos] - j * ten[pos + 1] + j * ten[pos] + i * ten[pos + 1]; pos = pos + 1; path[deep] = 2; search(deep + 1); } //l pos = lpos;num = last; if (pos % 3 != 1) { i = num / ten[pos] % 10; j = num / ten[pos - 1] % 10; num = num - i * ten[pos] - j * ten[pos - 1] + j * ten[pos] + i * ten[pos - 1]; pos = pos - 1; path[deep] = 3; search(deep + 1); } } main() { num = 0; max = 0; for (i = 1; i <= 9; i ++) { scanf("%c", &c); if (i != 9) scanf(" "); if (c == 'x') {num = num * 10; pos = i;}else { num = num * 10 + c - 48; max = max + cmax[i][c - 48]; } } for (i = 0; i < maxn; i ++) { hx[i] = new(struct point); hx[i]->next = NULL; } max = max + 30; result = max; search(0); if (result == max) printf("unsolvable"); else for (i = 0; i < max; i ++) if (opath[i] == 1) printf("u"); else if (opath[i] == 2) printf("r"); else if (opath[i] == 3) printf("l"); else if (opath[i] == 4) printf("d"); else for (i = 0; i < maxn; i ++) { p = hx[i]; while (p != NULL) { ne = p->next; free(p); p = ne; } } printf("\n"); } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator