/*作者:華中師範大學 SunJunyi*/
/*編譯器: Turboc2.0*/
/*演算法基本思想:回溯法*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10 /*進程個數的最大值*/
#define M 10 /*資源種類數的最大值*/
typedef struct{
int ip; /*當前可執行檔進程堆棧的棧頂指標*/
int able[N]; /*當前可執行檔進程堆棧*/
int remain[M]; /*每種資源的剩餘數組*/
int visited[N]; /*當前已經運行並釋放的進程標誌數組*/
}WorkNode; /*工作節點資料結構*/
int ass[N][M],need[N][M],r[M],pnum,rnum,top=-1; /*ass為進程與資源的分配矩陣,need為進程與資源的需求矩陣*/
WorkNode current,stack[N]; /*current為當前工作節點,stack為工作節點堆棧*/
void add(int [],int []); /*向量相加*/
void init(); /*初始化*/
void output(); /*輸出結果*/
int small(int [],int []); /*向量比較*/
int bankalgo(); /*銀行家演算法*/
int main(){
int ct=0;
clrscr();
init();
ct=bankalgo();
if(ct)
printf("/nit is safe,and it has %d solutions/n",ct);
else
printf("/nit is unsafe/n");
return 0;
}
void init(){
int i,j;
printf("process number:");
scanf("%d",&pnum);
printf("resource number:");
scanf("%d",&rnum);
printf("resource series:");
for(i=0;i<rnum;i++)scanf("%d",r+i);
printf("assigned matrix:/n");
for(i=0;i<pnum;i++){
printf("p%d:",i);
for(j=0;j<rnum;j++)scanf("%d",&ass[i][j]);
}
printf("needed matrix:/n");
for(i=0;i<pnum;i++){
printf("p%d:",i);
for(j=0;j<rnum;j++)scanf("%d",&need[i][j]);
}
}
void add(int x[],int y[]){
int i;
for(i=0;i<rnum;i++)
x[i]+=y[i];
}
int small(int x[],int y[]){
int i;
for(i=0;i<rnum;i++)
if(x[i]>y[i])break;
if(i==rnum)return 1;
return 0;
}
void output(){
int i;
for(i=0;i<top;i++)
printf("p%d-->",stack[i].able[stack[i].ip]);
printf("p%d/n",stack[i].able[stack[i].ip]);
}
int bankalgo(){
int i,j,sum=0,ct=0;
current.ip=-1;
memset(current.visited,sizeof(current.visited),0);
for(i=0;i<rnum;i++){
for(j=0;j<pnum;j++)
sum+=ass[j][i];
current.remain[i]=r[i]-sum;
sum=0;
}
for(i=0;i<pnum;i++){
if(small(need[i],current.remain) )
current.able[++current.ip]=i;
}
if(current.ip==-1)return 0;
while(1){
stack[++top]=current;
current.visited[current.able[current.ip]]=1;
add(current.remain,ass[current.able[current.ip]]);
current.ip=-1;
for(i=0;i<pnum;i++){
if(!current.visited[i] && small(need[i],current.remain))
current.able[++current.ip]=i;
}
if(current.ip==-1){
if(top==pnum-1){
output();
ct++;
}
current=stack[top--];
while(current.ip==0 && top>-1)current=stack[top--];
if(top==-1 && current.ip==0)break;
else current.ip--;
}
}
return ct;
}
測試結果如下(Andrews S.Tanenbaum的《現代操統系統》179頁)
process number:5
resource number:4
resource series:6 3 4 2
assined matrix:
p0:3 0 1 1
p1:0 1 0 0
p2:1 1 1 0
p3:1 1 0 1
p4:0 0 0 0
needed matrix:
p0:1 1 0 0
p1:0 1 1 2
p2:3 1 0 0
p3:0 0 1 0
p4:2 1 1 0
p3-->p4-->p0-->p2-->p1
p3-->p4-->p0-->p1-->p2
p3-->p0-->p4-->p2-->p1
p3-->p0-->p4-->p1-->p2
p3-->p0-->p2-->p4-->p1
p3-->p0-->p2-->p1-->p4
p3-->p0-->p1-->p4-->p2
p3-->p0-->p1-->p2-->p4
it is safe,and it has 8 solutions