这个程序为什么死循环?我要发疯了!!!!!!!!!!!!!!

zf_miles 2002-06-01 10:54:48
这是一个关于网络的算法,假设这个网络有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;
}
...全文
43 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Richuen22 2002-06-01
  • 打赏
  • 举报
回复
错在此
k=rand()%(m); //产生随机数(0-m) , 选择k条边
改为:
k=rand()%(m+1); //产生随机数(0-m) , 选择k条边
关于rand(),请看
http://www.csdn.net/expert/topic/771/771517.xml?temp=.6608393
Kklee 2002-06-01
  • 打赏
  • 举报
回复
我同意楼上的说法
alarm_zq 2002-06-01
  • 打赏
  • 举报
回复
老兄,这么长看起来可真有点费劲的,我建议你就找身边的朋友或者老师指点一下好了,我想这里很少人会仔细来看的。
zf_miles 2002-06-01
  • 打赏
  • 举报
回复
忘了说了,这个A,B,C,d的拓补结构如下图:
A B
------
| | |
-------
| | |
-------
C D

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧