5-12 罗密欧与朱丽叶的迷宫问题
注意:还可加入无解时的剪枝判断
-
#include <iostream>
-
#include <cstdio>
-
#include <cstring>
-
using namespace std;
-
-
const int NM=25;
-
int d[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
-
int vis[NM][NM],path[NM][NM],x[NM*NM],y[NM*NM],cc,gx,gy,n,m,ans,WAN;
-
bool flag;
-
struct Node{
-
int x,y,dir,wan;
-
};
-
-
void Backtrack(Node t,int kk)
-
{
-
int i;
-
Node pt;
-
-
if(t.x==gx && t.y==gy){
-
if(kk<cc) return;
-
flag=1;
-
if(t.wan<=WAN) {
-
if(t.wan<WAN) {
-
WAN=t.wan;ans=1;
-
for(i=0;i<=cc;i++)
-
path[x[i]][y[i]]=i+2;
-
}
-
else if(t.wan==WAN) ans++;
-
}
-
return;
-
}
-
-
if(t.wan>WAN || kk==cc) return;
-
for(i=0;i<8;i++){
-
pt.x=t.x+d[i][0];pt.y=t.y+d[i][1];
-
if(pt.x>0 &&pt.x<=n &&pt.y>0 && pt.y<=m && vis[pt.x][pt.y]!=-1){
-
if(t.dir!=i) t.wan++;
-
pt.dir=i;pt.wan=t.wan;
-
vis[pt.x][pt.y]=-1;
-
x[kk]=pt.x;y[kk]=pt.y;
-
-
Backtrack(pt,kk+1);
-
vis[pt.x][pt.y]=0;
-
if(t.dir!=i) t.wan--;
-
x[kk]=y[kk]=0;
-
}
-
}
-
}
-
-
int main()
-
{
-
int i,j,k,x,y,bx,by;
-
Node pt;
-
while(~scanf("%d%d%d",&n,&m,&k))
-
{
-
for(i=0;i<k;i++){
-
scanf("%d%d",&x,&y);
-
path[x][y]=vis[x][y]=-1;
-
}
-
scanf("%d%d",&bx,&by);
-
scanf("%d%d",&gx,&gy);
-
-
vis[bx][by]=-1;
-
path[bx][by]=1;path[gx][gy]=10;
-
cc=n*m-1-k;
-
WAN=0xfffffff;
-
ans=0;
-
pt.x=bx;pt.y=by;pt.wan=-1;pt.dir=0;
-
flag=false;
-
Backtrack(pt,0);
-
-
if(!flag) {
-
printf("No solution!\n");continue;
-
}
-
printf("%d\n%d\n",WAN,ans);
-
for(i=1;i<=n;i++){
-
for(j=1;j<=m;j++){
-
printf("%d ",path[i][j]);
-
}
-
printf("\n");
-
}
-
}
-
return 0;
-
}
-
-
-
-
-
-
-
-
-
-
-
5-16 无优先级运算问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int NM=25;
int a[NM],vis[NM],save[NM],f[NM],k,n,m;
char sf[4]={‘+‘,‘-‘,‘*‘,‘/‘};
bool flag;
bool Backtrack(int t,int res)
{
int i,j;
if(res==m) {
flag=true;
for(i=1;i<t;i++) {
cout<<save[i];
if(i<t-1) cout<<sf[f[i]];
}
cout<<endl;
return true;
}
if(t>k) {
return false;
}
for(j=0;j<n;j++)
{
if(t==1) {
vis[j]=1;save[t]=a[j];
Backtrack(t+1,a[j]);
if(flag) return true;
vis[j]=0;save[t]=0;
}
else //
if(!vis[j]){
vis[j]=1;save[t]=a[j];
for(i=0;i<4;i++){
f[t-1]=i;
if(i==0) Backtrack(t+1,res+a[j]);
else if(i==1) Backtrack(t+1,res-a[j]);
else if(i==2) Backtrack(t+1,res*a[j]);
else {
if(res%a[j]==0) Backtrack(t+1,res/a[j]);
}
if(flag) return true;
}
vis[j]=0;save[t]=0;
}
}
return false;
}
void compute()
{
int mmaxk=25;
memset(vis,0,sizeof(vis));
k=2;
while(!Backtrack(1,0)){
memset(vis,0,sizeof(vis));
if(k>mmaxk) break;
k++;
}
}
int main()
{
int i;
while(cin>>n)
{
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
cin>>m;
flag=false;
compute();
if(!flag) cout<<"No solution!"<<endl;
}
return 0;
}
/*
10 111
1 6 7 7 8 9 44 33 55 66
4 5
1 3 1 2
2 5
1 6
*/
第三章 习题(三),布布扣,bubuko.com
第三章 习题(三)
原文:http://blog.csdn.net/killua_99/article/details/21894703