#include<stdio.h>
#include<stdlib.h>
int mark[12][12], maze[12][12];
int move[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
int m, n;
struct
{
int x[100], y[100];
int top;
}path;
int SeekPath(int x, int y);
void main()
{
int i,j;
scanf("%d%d", &m, &n);
for (i = 1; i <= m;i++)
for (j = 1; j <= n; j++)
scanf("%d", &maze[i][j]);
for (i = 0; i <= m + 1; i++)
{
maze[i][0] = 1;
maze[i][n + 1] = 1;
}
for (j = 1; j <= n; j++)
{
maze[0][j] = 1;
maze[m + 1][j] = 1;
}
for (i = 0; i <= m + 1;i++)
for (j = 1; j <= n + 1; j++)
mark[i][j] = 0;
path.top = 0;
if (SeekPath(1, 1))
{
path.x[path.top] = 1;
path.y[path.top] = 1;
path.top++;
}
j = 1;
for (i = path.top - 1; i >= 0; i--)
{
printf("(%d,%d)", path.x[i], path.y[i]);
if ((j++) % 5 == 0)
printf("\n");
}
system("pause");
}
int SeekPath(int x, int y)
{
int i, g, h;
mark[x][y] = 1;
if (x == m&&y == n)
return(1);
for (i = 0; i <=4; i++)
{
g = x + move[i][0];
h = y + move[i][1];
if ((maze[g][h] == 0) && (mark[g][h] == 0))
{
mark[g][h] = 1;
if (SeekPath(g, h))
{
path.x[path.top] = g;
path.y[path.top] = h;
path.top++;
return(1);
}
}
}
return(0);
}
struct
{
int x, y;
int px, py;
}que[100],s[100];
int h, t;
int top;
int SeekPath(int x, int y)
{
int cx, cy, cpx, cpy, dx, dy, i;
que[t].x = x;
que[t].y = y;
que[t].px = 0;
que[t].py = 0;
t++;
s[top].x = x;
s[top].y = y;
s[top].px = 0;
s[top].py = 0;
top++;
while (h != t)
{
cx = que[h].x;
cy = que[h].y;
cpx = que[h].px;
cpy = que[h].py;
h++;
if (cx == m&&cy == n)
{
break;
}
s[top].x = cx;
s[top].y = cy;
s[top].px = cpx;
s[top].py = cpy;
top++;
for (i = 0; i < 4; i++)
{
dx = cx + move[i][0];
dy = cy + move[i][1];
if (maze[dx][dy] == 0 && mark[dx][dy] == 0)
{
mark[dx][dy] = 1;
que[t].x = dx;
que[t].y = dy;
que[t].px = cx;
que[t].py = cy;
t++;
}
}
}
printf("%d,%d\n", cx, cy);
while (top != 0)
{
if (cpy == s[top].x&&cpy == s[top].y)
{
printf("%d,%d\n", cpx, cpy);
cpx = s[top].px;
cpy = s[top].py;
}
top--;
}
return(0);
}
#include<stdio.h>
#define M 4
#define N 5
int move[8][2] = { { -1, -2 }, { -1, 2 }, { -2, 1 }, { -2, -1 }, { 2, 1 }, { 2, -1 }, { 1, 2 }, { 1, -2 } };
int mark[M][N] = {
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
int SeekPath(int x, int y);
int sx, sy, num;
int main()
{
scanf("%d%d", &sx, &sy);
sx--;
sy--;
num = 0;
mark[sx][sy] = 1;
SeekPath(sx, sy);
printf("%d\n", num);
return 0;
}
int SeekPath(int x, int y)
{
int i, dx, dy;
for (i = 0; i < 8; i++)
{
dx = x + move[i][0];
dy = y + move[i][1];
if (dx >= 0 && dy >= 0 && dx < M&&dy < N&&mark[dx][dy] == 0)
{
mark[dx][dy] = 1;
SeekPath(dx, dy);
mark[dx][dy] = 0;
}
if (dx == sx&&dy == sy)
num++;
}
return(0);
}
//
//struct QUETP
//{
// char que[QN][21];
// int c[QN];
// int front, rear;
//};
#include<stdio.h>
#include<string.h>
#define QN 1000
struct QUETP
{
char que[QN][21];
int c[QN];
int front, rear;
}que;
void initqueue(struct QUETP *q)
{
q->front = 0;
q->rear = 0;
}
int enqueue(struct QUETP*q, char*str, int m)
{
if (q->front == (q->rear + 1) % QN)
return(0);
strcpy(q->que[q->rear], str);
q->c[q->rear] = m;
q->rear = (q->rear + 1) % QN;
return(1);
}
int delqueue(struct QUETP*q, char*str, int *m)
{
if (q->front == q->rear)
return(0);
strcpy(str, q->que[q->front]);
*m = q->c[q->front];
q->front = (q->front + 1) % QN;
return(1);
}
int emptyqueue(struct QUETP q)
{
if (q.front == q.rear)
return(1);
else
return(0);
}
int findstr(char*strs, int k, char*substr)
{
int len, slen, i, j;
len = strlen(strs);
slen = strlen(substr);
for (i = k; i < len - slen + 1; i++)
{
for (j = 0; j < slen; j++)
{
if (strs[j + i] != substr[j])
break;
}
if (j == slen)
return(i);
}
return(-1);
}
void replstr(char*strs, int pos, char*substr1, char*substr2, char *tarstr)
{
int len;
len = strlen(substr1);
strcpy(tarstr, strs);
tarstr[pos] = '\0';
strcat(tarstr, substr2);
strcat(tarstr, &strs[pos + len]);
}
void main()
{
struct
{
char StrS[21], StrT[21];
}rule[6];
char strA[21], strB[21], currstr[200], tarstr[200];
FILE*fp;
int n, i, k, count, fg, m;
fp = fopen("in.txt", "r");
fscanf(fp, "%d", &m);
while (m-- > 0)
{
fscanf(fp, "%s%s", strA, strB);
fscanf(fp, "%d", &n);
for (i = 0; i < n; i++)
{
fscanf(fp, "%s%s", rule[i].StrS, rule[i].StrT);
}
initqueue(&que);
if (enqueue(&que, strA, 0) == 0)
return;
count = 0; fg = 0;
while (!emptyqueue(que))
{
delqueue(&que, currstr, &count);
if (strcmp(currstr, strB) == 0)
{
fg = 1;
break;
}
if (count > 10)
continue;
for (i = 0; i < n; i++)
{
k = 0;
while (k>0)
{
k = findstr(currstr, k, rule[i].StrS);
if (k >= 0)
{
replstr(currstr, k, rule[i].StrS, rule[i].StrT,tarstr);
if (strlen(tarstr) <= 20)
{
if (enqueue(&que, tarstr, count + 1) == 0)
{
printf("Queue Overflow\n");
goto rt;
}
}
k++;
}
}
}
}
rt:
if (fg == 0)
printf("NO ANSWER!\n");
else
printf("%d\t", count);
}
fclose(fp);
return;
}
#include<stdio.h>
#include<string.h>
struct
{
char StrS[21], StrT[21];
}rule[6];
char strA[21], strB[21];
int findstr(char*strs, int k, char*substr)
{
int len, slen, i, j;
len = strlen(strs);
slen = strlen(substr);
for (i = k; i < len - slen + 1; i++)
{
for (j = 0; j < slen; j++)
{
if (strs[j + i] != substr[j])
break;
}
if (j == slen)
return(i);
}
return(-1);
}
void replstr(char*strs, int pos, char*substr1, char*substr2, char*tarstr)
{
int len;
len = strlen(substr1);
strcpy(tarstr, strs);
tarstr[pos] = '\0';
strcat(tarstr, substr2);
strcat(tarstr, &strs[pos + len]);
}
void tryreplace(char*str, int lev, int*fg, int n)
{
int k, i;
char currstr[230], tarstr[230];
if (*fg > 0)
return;
if (strcmp(str, strB) == 0)
{
*fg = lev;
return;
}
if (lev >= 10)
return;
strcpy(currstr, str);
for (i = 0; i < n; i++)
{
k = 0;
while (k>0)
{
k = findstr(currstr, k, rule[i].StrS);
if (k < 0)
break;
if (k >= 0)
{
replstr(currstr, k, rule[i].StrS, rule[i].StrT, tarstr);
if (strlen(tarstr) <= 0)
{
tryreplace(tarstr, lev + 1, fg, n);
if (*fg>0)
return;
}
}
k++;
}
}
return;
}
void main()
{
char currstr[200];
FILE*fp;
int n, i, fg, m;
fp = fopen("in.txt", "r");
fscanf(fp, "%d", &m);
while (m-- > 0)
{
fscanf(fp, "%d", &n);
for (i = 0; i < n; i++)
{
fscanf(fp, "%s%s", rule[i].StrS, rule[i].StrT);
}
strcpy(currstr, strA);
fg = 0;
tryreplace(currstr, 0, &fg, n);
if (fg == 0)
printf("NO ANSWEER!\n");
else
printf("%d\n", fg);
}
fclose(fp);
}
#include<stdio.h>
#define MAX_NODE 10000
#define MAX_LEVEL 500
typedef struct nodetp
{
int digit, res;
int parent;
}nodetp;
nodetp queue[MAX_NODE];
int tail;
int setx[10], num, existres[MAX_NODE];
void print_res(int n)
{
int i, k = 0;
char s[MAX_LEVEL];
for (i = n; i > 0; i = queue[i].parent)
s[k + 1] = '0' + queue[i].digit;
while (k > 0)
putchar(s[--k]);
putchar('\n');
}
int trySearch(int hd)
{
int i, r;
for (i = (hd == 0); i < 10; i++)
{
if (!setx[i])
continue;
r = (queue[hd].res * 10 + i) % num;
if (existres[r])
continue;
existres[r] = 1;
queue[tail].digit = i;
queue[tail].res = r;
queue[tail].parent = hd;
tail++;
if (r == 0)
{
print_res(tail - 1);
return(1);
}
}
return(0);
}
void main(void)
{
int i, t, m, head, end, level, fg;
while (1)
{
scanf("%d",&num);
if (num == 0)
break;
for (i = 0; i < 10; i++)
setx[i] = 0;
for (i = 0; i < MAX_NODE; i++)
existres[i] = 0;
scanf("%d", &m);
for (i = 0; i < m; i++)
{
scanf("%d", &m);
setx[t] = 1;
}
queue[0].digit = queue[0].res = 0;
queue[0].parent = -1;
tail = 1;
fg = 0;
for (head = level = 0; level < MAX_LEVEL; level++)
{
for (end = tail; head < end; head++)
if (trySearch(head) == 1)
{
fg = 1;
break;
}
if (fg = 1)
break;
}
if (fg = 0)
printf("NOFOUND\n");
}
}
Boolean visited[MAX];
void DFSTraverse(Graph G)
{
for (v = 0; v < G.vexnum; ++v)
visited[v] = FALSE;
for (v = 0; v < G.vexnum;++v)
if (!visited[v])
DFS(G, v);
}
void DFS(Graph G, int v)
{
visited[v] = TRUE;
Visited(v);
for (w = FirstAdjVex(G, v); w;w=NextAdjVex(G,v,w))
if (!visited[w])
DFS(G, w);
}
void BFSTraverse(Graph G)
{
for (v = 0; v < G.vexnum; ++v)
visited[v] = FALSE;
InitQueue(Q);
for (v = 0; v < G.vexnum;++v)
if (!visited[v])
{
visited[v] = TRUE;
visit(v);
Enqueue(Q, v);
while (!QueueEmpty(Q))
{
Dequeue(Q, u);
for (w = FirstAdjVex(G, u); w;w=NextAdjVex(G,u,w))
if (!visited[w])
{
visited[w] = TRUE;
visit(w);
EnQueue(Q, w);
}
}
}
}
#include<string.h>
char a[100][100];
int b[100][100], n, m;
int x [] = { 0, -1, -1, -1, 0, 1, 1, 1 };
int y [] = { 1, 1, 0, -1, -1, -1, 0, 1 };
void dfs(int i, int j)
{
int k;
int tx, ty;
b[i][j] = 0; //设置标志
for (k = 0; k < 8; k++)//对8个方向逐个检查
{
tx = i + x[k];//计算新节点的位置
ty = j + y[k];//节点坐标合法,并没有被访问,连通值为'@'
if (tx >= 0 && tx < n&&ty >= 0 && ty < m&&b[tx][ty] && a[tx][ty] == '@')
dfs(tx, ty);//从新节点开始,递归
}
}
int main()
{
int i, j, num;
while (1)
{
scanf("%d %d", &n, &m);
if (n == 0 && m == 0)//测试数据结束
break;
for (i=0; i < n;i++)
for (j = 0; j < m; j++)
b[i][j] = 1;//标志数组设初值
num = 0;//地块个数计数初始化
for (i = 0; i < n; i++)//读入n行
scanf("%s", &a[i]);//读入每行m个字符
for (i = 0; i < n; i++)
{
for (j = 0; j < m;j++)//查找有石油的节点
if (b[i][j] && a[i][j] == '@')
{
num++;//计数加1
dfs(i, j);//从此节点开始搜索,调用算法bfs(i,j)
}
}
printf("%d\n", num);
}
return(0);
}
int queue[10000][2];//增加一个队列
void bfs(int i, int j)
{
int k, tx, ty, cx, cy;
int head = 0, tail = 0;//队列头尾指针的初值
queue[tail][0] = i;//当前位置进入队列
queue[tail][1] = j;
tail++;//队列指针加1
b[i][j] = 0;//设置标志
while (head < tail)//队列不空
{
cx = queue[head][0];//出队
cy = queue[head][1];
head++;//对头指针加1
for (k = 0; k < 8; k++)//对8个方向逐个检查,并计算新节点的位置
{
tx = cx + x[k];
ty = cy + y[k];
if (tx >= 0 && tx < n&&ty >= 0 && ty < m&&b[tx][ty] && a[tx][ty] == '@')//满足条件,进入队列
{
queue[tail][0] = tx;
queue[tail][1] = ty;
tail++;
b[tx][ty] = 0;
}
}
}
}