深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<stdio.h>
#include<string.h>
int fx[4]={0,1,0,-1};int fy[4]={1,0,-1,0};
int xx,yy;int l=-1,r=0;
int maze[5][5];int vis[5][5]={0};
int step;
struct node{
int x,y;int step;
}a[100000];
void dfs(int ans,int x,int y){
if(x==4&&y==4&&ans==step){
return;
}
for(int i=0;i<4;i++){
xx=x+fx[i];
yy=y+fy[i];
if(xx>=0&&xx<5&&yy>=0&&yy<5&&maze[xx][yy]==0&&vis[xx][yy]==0){
ans++;
dfs(ans,xx,yy);
a[ans].x=x+fx[i];a[ans].y=y+fy[i];ans--;
return;
}
}
}
int main()
{
for(int j=0;j<5;j++){
for(int k=0;k<5;k++){
scanf("%d",&maze[j][k]);
}
} a[0].x=0,a[0].y=0;a[0].step=0;maze[0][0]=1;
while(r>l){
l++;
if(a[l].x==4&&a[l].y==4){
break;
}
for(int i=0;i<4;i++){
xx=a[l].x+fx[i];
yy=a[l].y+fy[i];
if(xx>=0&&xx<5&&yy>=0&&yy<5&&maze[xx][yy]==0&&vis[xx][yy]==0){
vis[xx][yy]=1;r++;
a[r].x=xx;a[r].y=yy;a[r].step=a[l].step+1;
}
}
}
step=a[l].step;l=0;r=0;
memcpy(vis,maze,sizeof(maze));
dfs(0,0,0);
for(int i=0;i<step;i++){
printf("(%d, %d)\n",a[i].x,a[i].y);
}
printf("(4, 4)\n");
return 0;
}
您将获得一个由括号( )和[ ]组成的字符串。这种类型的字符串被认为是正确的:
- 如果是空字符串
- 如果A和B是正确的,AB是正确的,
- 如果A是正确的,(A) 和 [A] 是正确的。
编写一个程序,该程序采用此类型的字符串序列并检查其正确性。您的程序可以假定最大字符串长度为128。
输入
第一行包含测试用例n 的数量。接下来的n行中的每一行都包含括号( )和[ ]的字符串。
输出
对于每个测试用例,如果表达式正确,则在单独的行中打印"是",否则打印"否"。
示例 1
3
([])
(([()])))
([()[]()])()
Yes
No
Yes
示例 2
22
((()
())))
([)]
((([[[]]])])
([])
(([()])))
([()[]()])()
[(])
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
(])
[)]
[)))]
[[)]
([])
(([()])))
([()[]()])()
([)]
(
()(
[()
No
Yes
No
No
Yes
No
Yes
No
Yes
No
Yes
No
No
No
No
Yes
No
Yes
No
No
No
No
#include<stdio.h>
#include<string.h>
int main()
{
char s[200];
int n;int len;
scanf("%d",&n);getchar();
for(int i=0;i<n;i++){
memset(s,'\0',sizeof(s));
for(int j=0;j<1000;j++){
scanf("%c",&s[j]);
if(s[j]==10){
break;
}
}
if(s[0]=='\n'){
printf("Yes\n");
continue;
}
len=strlen(s)-1;
if(len==1||len%2==1){
printf("No\n");
continue;
}
char cmp=s[0];int judge=1;int cmp1=0;
for(int i=1;i<len;i++){
judge=0;
if((cmp==s[i]-1||cmp==s[i]-2)&&(i-cmp1)%2==1){
judge=1;
for(int j=cmp1,k=i;j<k;j++,k--){
if(s[j]!=s[k]-1&&s[j]!=s[k]-2&&s[j]!=s[k]+1&&s[k]!=s[k]+2){
judge=0;break;
}
}
if(judge!=0){
cmp=s[i+1];cmp1=i+1;
}
}
}
if(judge==1){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}