这个程序为什么死循环?我要发疯了!!!!!!!!!!!!!!
这是一个关于网络的算法,假设这个网络有3*3个节点,每个节点只能发送或者接收且接收发送只能发送一个单位信息.程序要求出什么时候可以传送完成.其中每个节点如果有A信息则它与01000B相与为01000B,同理B,C,D为0100B,010B,01B;
#include <iostream.h>
#include <stdlib.h>
const int M=2;
const int N=2;
struct Node{
bool sel; //是否被选中
char flag; //用于指示有哪些信息
bool edge[4]; //四条边是否被选中
}node[M+1][N+1];
//初试化节点
void InitNodes()
{
int i,j;
for (i=0;i<=M;i++)
for (j=0;j<=N;j++){
node[i][j].sel=false; //初试的时候没有被选中
node[i][j].flag=0; //没有信息
for (int k=0;k<4;k++)
node[i][j].edge[k]=false; //没有边在图G'中
}
// 初试化A,B,C,D
node[0][0].flag=8;
node[M][0].flag=4;
node[0][N].flag=2;
node[M][N].flag=1;
}
//找出成对的节点
// 注:每次只要寻找当前节点右边以及下边的节点就可以了。
void FindPairNode()
{
int i,j;
for (i=0;i<=M;i++)
for (j=0;j<=N;j++){
if (i+1<=M &&
node[i][j].flag != node[i+1][j].flag){ //右边节点
node[i][j].sel=true;
node[i+1][j].sel=true;
node[i][j].edge[0]=node[i+1][j].edge[2]=true;
}
if (j+1<=N &&
node[i][j].flag != node[i][j+1].flag){ // 下边节点
node[i][j].sel=node[i][j+1].sel=true;
node[i][j].edge[1]=node[i][j+1].edge[3]=true;
}
}
}
// 从[i,j]点发送信息至[k,m]点或者相反
void SendMsg(int i,int j,int k,int m)
{
if ((node[i][j].flag&8) != (node[k][m].flag&8) ){ // 有一个没有A
if((node[i][j].flag&8) == 8){ //A 点有A信息
node[k][m].flag |=8; //发送至B点
}
else
if((node[k][m].flag&8) == 8){
node[i][j].flag |=8;
}
}
else
if((node[i][j].flag&4) != (node[k][m].flag&4) ){
if((node[i][j].flag&4) == 4){
node[k][m].flag |=4;
}
else
if((node[k][m].flag&4) == 4){
node[i][j].flag |=4;
}
}
else
if((node[i][j].flag&2) != (node[k][m].flag&2) ){
if((node[i][j].flag&2) == 2){
node[k][m].flag |=2;
}
else
if((node[k][m].flag&2) == 2){
node[i][j].flag |=2;
}
}
else
if((node[i][j].flag&1) != (node[k][m].flag&1) ){
if((node[i][j].flag&1) == 1){
node[k][m].flag |=1;
}
else
if((node[k][m].flag&1) == 1){
node[i][j].flag |=1;
}
}
for (int l=0;l<4;l++){
node[i][j].edge[l]=node[k][m].edge[l]=false; //删除与这个点相关联的边
}
if(i+1<=M) node[i+1][j].edge[2]=false;
if(j+1<=N) node[i][j+1].edge[3]=false;
if(i-1>=0) node[i-1][j].edge[0]=false;
if(j-1>=0) node[i][j-1].edge[1]=false;
if(k+1<=M) node[k+1][m].edge[2]=false;
if(m+1<=N) node[k][m+1].edge[3]=false;
if(k-1>=0) node[k-1][m].edge[0]=false;
if(m-1>=0) node[k][m-1].edge[1]=false;
}
// 是否发送完成
bool IsDone()
{
int i,j;
for(i=0;i<=M;i++){
for(j=0;j<=N;j++){
if (node[i][j].flag !=(char)15) //没有发送完成
return false;
}
}
return true;
}
void ResetNodes()
{
for (int i=0;i<=M;i++)
for (int j=0;j<=N;j++){
node[i][j].sel=false;
for(int m=0;m<4;m++)
node[i][j].edge[m]=false;
}
}
void main()
{
int times=0;
InitNodes();
while(!IsDone()){
times++;
FindPairNode();
for (int j=0;j<=N;j++)
for (int i=0;i<=M;i++){
int k,m=0;
for (int l=0;l<4;l++){
if (node[i][j].edge[l]){
m++; //总共边数
}
}
if(m==0) break;
k=rand()%(m); //产生随机数(0-m) , 选择k条边
int n;
l=0;
for (n=0;n<4;n++){
if (node[i][j].edge[n] == true){
if (l==k) break; // 寻找第k条边
l++;
}
}
switch(n){
case 0:
SendMsg(i,j,i+1,j);
break;
case 1:
SendMsg(i,j,i,j+1);
break;
case 2:
SendMsg(i,j,i-1,j);
break;
case 3:
SendMsg(i,j,i,j-1);
break;
}
}
cout<<"At times "<<times<<":\n";
for (int y=0;y<=N;y++){
for (int x=0;x<=M;x++){
cout<<(int)node[x][y].flag<<"\t";
}
cout<<endl;
}
ResetNodes();
}
cout<<times<<endl;
}