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;//vis[gx][gy]=2;
- 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;
- }
- /*
- 2 2 1
- 1 2
- 1 1
- 2 2
- 4 5 2
- 1 5
- 3 3
- 1 1
- 4 4
- */
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
*/