原题: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行...