您的位置:首页 > Web前端 > JavaScript

[DFS]FJSDFZOJ 1427 寻找国都名

2014-02-03 13:52 295 查看
原题:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1427

时间:2014.2.3

类型:回溯,dfs

源码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int m,n,d[11],beginh,beginl;
char map[11][11];
string ob;
bool ans=false,first=true;

void search(int i,int j,int s,int num)
{
if(num==ob.size()) { ans=true; }
if(ans) { return; }
switch(s)
{
case 0:
beginh=i;
beginl=j;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
case 1:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 2:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 3:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 4:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 5:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 6:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 7:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
case 8:
if(ob[num]==map[i][j])
{
d[num]=s;
if(j+1<=n) { search(i,j+1,1,num+1); }
if(j-1>=1) { search(i,j-1,2,num+1); }
if(i+1<=m) { search(i+1,j,3,num+1); }
if(i-1>=1) { search(i-1,j,4,num+1); }
if(j-1>=1&&i+1<=m) { search(i+1,j-1,5,num+1); }
if(j+1<=n&&i-1>=1) { search(i-1,j+1,6,num+1); }
if(j+1<=n&&i+1<=m) { search(i+1,j+1,7,num+1); }
if(j-1>=1&&i-1>=1) { search(i-1,j-1,8,num+1); }
break;
}
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
cin>>ob;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(ob[0]==map[i][j]) search(i,j,0,0);
}
}
if(ans)
{
cout<<beginh<<" "<<beginl<<endl;
for(int i=1;i<=ob.size()-1;i++) { cout<<d[i]; }
}
else cout<<"No Answer!";
return 0;
}


最后状态:AC

总结:写的不怎么样,167行...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  回溯 递归 dfs